]> git.proxmox.com Git - mirror_edk2.git/commitdiff
remove EFI 1.10 network stack.
authorvanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Sun, 22 Mar 2009 04:27:03 +0000 (04:27 +0000)
committervanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Sun, 22 Mar 2009 04:27:03 +0000 (04:27 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7920 6f19259b-4bc3-4df7-8a09-765794883524

31 files changed:
MdeModulePkg/MdeModulePkg.dsc
MdeModulePkg/Universal/Network/PxeBcDxe/Bc.c [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Bc.h [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/ComponentName.c [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Dhcp.h [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Ebc/PxeArch.c [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Ebc/PxeArch.h [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Hton.h [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Ia32/PxeArch.h [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Ipf/PxeArch.h [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/PxeBcDxe.inf [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_arp.c [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_dhcp.c [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_igmp.c [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_ip.c [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_mtftp.c [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_udp.c [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_loadfile.c [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/Tftp.h [deleted file]
MdeModulePkg/Universal/Network/PxeBcDxe/X64/PxeArch.h [deleted file]
MdeModulePkg/Universal/Network/PxeDhcp4Dxe/ComponentName.c [deleted file]
MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.c [deleted file]
MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.h [deleted file]
MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Dxe.inf [deleted file]
MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4InitSelect.c [deleted file]
MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Release.c [deleted file]
MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4RenewRebind.c [deleted file]
MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Run.c [deleted file]
MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Setup.c [deleted file]
MdeModulePkg/Universal/Network/PxeDhcp4Dxe/Support.c [deleted file]

index 98dbf0f2e0dcac42eb2c3618e7544be292390a71..2644557e45ab8e2b30aa80d46803e88c689e70d9 100644 (file)
   MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf\r
   MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf\r
   MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf\r
-  MdeModulePkg/Universal/Network/PxeBcDxe/PxeBcDxe.inf\r
-  MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Dxe.inf\r
   MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf\r
   MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf\r
   MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.c b/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.c
deleted file mode 100644 (file)
index 41d06f6..0000000
+++ /dev/null
@@ -1,2429 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-\r
-  bc.c\r
-\r
-Abstract:\r
-\r
-\r
-**/\r
-\r
-#include "Bc.h"\r
-\r
-//\r
-//\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcDriverSupported (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcDriverStart (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcDriverStop (\r
-  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN  EFI_HANDLE                     Controller,\r
-  IN  UINTN                          NumberOfChildren,\r
-  IN  EFI_HANDLE                     *ChildHandleBuffer\r
-  );\r
-\r
-extern\r
-VOID\r
-InitArpHeader (\r
-  VOID\r
-  );\r
-extern\r
-VOID\r
-OptionsStrucInit (\r
-  VOID\r
-  );\r
-\r
-//\r
-// helper routines\r
-//\r
-\r
-/**\r
-  Convert number to ASCII value\r
-\r
-  @param  Number               Numeric value to convert to decimal ASCII value.\r
-  @param  Buffer               Buffer to place ASCII version of the Number\r
-  @param  Length               Length of Buffer.\r
-\r
-  @retval none                 none\r
-\r
-**/\r
-VOID\r
-CvtNum (\r
-  IN UINTN  Number,\r
-  IN UINT8  *Buffer,\r
-  IN INTN   Length\r
-  )\r
-{\r
-  UINTN Remainder;\r
-\r
-  while (Length--) {\r
-    Remainder = Number % 10;\r
-    Number /= 10;\r
-    Buffer[Length] = (UINT8) ('0' + Remainder);\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Convert number to decimal ASCII value at Buffer location\r
-\r
-  @param  Number               Numeric value to convert to decimal ASCII value.\r
-  @param  Buffer               Buffer to place ASCII version of the Number\r
-\r
-  @retval none                 none\r
-\r
-**/\r
-VOID\r
-UtoA10 (\r
-  IN UINTN Number,\r
-  IN UINT8 *Buffer\r
-  )\r
-{\r
-  INTN  Index;\r
-  UINT8 BuffArray[31];\r
-\r
-  BuffArray[30] = 0;\r
-  CvtNum (Number, BuffArray, 30);\r
-\r
-  for (Index = 0; Index < 30; ++Index) {\r
-    if (BuffArray[Index] != '0') {\r
-      break;\r
-    }\r
-  }\r
-\r
-  CopyMem (Buffer, BuffArray + Index, 31 - Index);\r
-}\r
-\r
-\r
-/**\r
-  Convert ASCII numeric string to a UINTN value\r
-\r
-  @param  Number               Numeric value to convert to decimal ASCII value.\r
-  @param  Buffer               Buffer to place ASCII version of the Number\r
-\r
-  @retval Value                UINTN value of the ASCII string.\r
-\r
-**/\r
-UINTN\r
-AtoU (\r
-  IN UINT8 *Buffer\r
-  )\r
-{\r
-  UINTN Value;\r
-  INT8  Character;\r
-\r
-  Value     = 0;\r
-  Character = *Buffer++;\r
-  do {\r
-    Value     = Value * 10 + Character - '0';\r
-    Character = *Buffer++;\r
-  } while (Character);\r
-\r
-  return Value;\r
-}\r
-\r
-\r
-/**\r
-  Convert ASCII numeric string to a UINTN value\r
-\r
-  @param  Number               Numeric value to convert to decimal ASCII value.\r
-  @param  Buffer               Buffer to place ASCII version of the Number\r
-\r
-  @retval Value                UINTN value of the ASCII string.\r
-\r
-**/\r
-UINT64\r
-AtoU64 (\r
-  IN UINT8 *Buffer\r
-  )\r
-{\r
-  UINT64  Value;\r
-  UINT8   Character;\r
-\r
-  Value = 0;\r
-  while ((Character = *Buffer++) != '\0') {\r
-    Value = MultU64x32 (Value, 10) + (Character - '0');\r
-  }\r
-\r
-  return Value;\r
-}\r
-//\r
-// random number generator\r
-//\r
-#define RANDOM_MULTIPLIER   2053\r
-#define RANDOM_ADD_IN_VALUE 19\r
-\r
-VOID\r
-SeedRandom (\r
-  IN PXE_BASECODE_DEVICE  *Private,\r
-  IN UINT16               InitialSeed\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Initialize the Seed for the random number generator\r
-\r
-  Arguments:\r
-\r
-  Returns:\r
-    none                -\r
-\r
---*/\r
-{\r
-  if (Private != NULL) {\r
-    Private->RandomSeed = InitialSeed;\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Generate and return a pseudo-random number\r
-\r
-\r
-  @retval Number               UINT16 random number\r
-\r
-**/\r
-UINT16\r
-Random (\r
-  IN PXE_BASECODE_DEVICE  *Private\r
-  )\r
-{\r
-  UINTN Number;\r
-\r
-  if (Private != NULL) {\r
-    Number = -(INTN) Private->RandomSeed * RANDOM_MULTIPLIER + RANDOM_ADD_IN_VALUE;\r
-\r
-    return Private->RandomSeed = (UINT16) Number;\r
-  } else {\r
-    return 0;\r
-  }\r
-}\r
-//\r
-// calculate the internet checksum (RFC 1071)\r
-// return 16 bit ones complement of ones complement sum of 16 bit words\r
-//\r
-\r
-/**\r
-  Calculate the internet checksum (see RFC 1071)\r
-\r
-  @param  Packet               Buffer which contains the data to be checksummed\r
-  @param  Length               Length to be checksummed\r
-\r
-  @retval Checksum             Returns the 16 bit ones complement of  ones\r
-                               complement sum of 16 bit words\r
-\r
-**/\r
-UINT16\r
-IpChecksum (\r
-  IN UINT16 *Packet,\r
-  IN UINTN  Length\r
-  )\r
-{\r
-  UINT32  Sum;\r
-  UINT8   Odd;\r
-\r
-  Sum = 0;\r
-  Odd = (UINT8) (Length & 1);\r
-  Length >>= 1;\r
-  while (Length--) {\r
-    Sum += *Packet++;\r
-  }\r
-\r
-  if (Odd) {\r
-    Sum += *(UINT8 *) Packet;\r
-  }\r
-\r
-  Sum = (Sum & 0xffff) + (Sum >> 16);\r
-  //\r
-  // in case above carried\r
-  //\r
-  Sum += Sum >> 16;\r
-\r
-  return (UINT16) (~ (UINT16) Sum);\r
-}\r
-\r
-\r
-/**\r
-  Calculate the internet checksum (see RFC 1071)\r
-  on a non contiguous header and data\r
-\r
-  @param  Header               Buffer which contains the data to be checksummed\r
-  @param  HeaderLen            Length to be checksummed\r
-  @param  Message              Buffer which contains the data to be checksummed\r
-  @param  MessageLen           Length to be checksummed\r
-\r
-  @retval Checksum             Returns the 16 bit ones complement of  ones\r
-                               complement sum of 16 bit words\r
-\r
-**/\r
-UINT16\r
-IpChecksum2 (\r
-  IN UINT16 *Header,\r
-  IN UINTN  HeaderLen,\r
-  IN UINT16 *Message,\r
-  IN UINTN  MessageLen\r
-  )\r
-{\r
-  UINT32  Sum;\r
-  UINT16  HeaderChecksum;\r
-  UINT16  MessageChecksum;\r
-\r
-  HeaderChecksum = (UINT16)~IpChecksum (Header, HeaderLen);\r
-  MessageChecksum = (UINT16)~IpChecksum (Message, MessageLen);\r
-  Sum = HeaderChecksum + MessageChecksum;\r
-\r
-  //\r
-  // in case above carried\r
-  //\r
-  Sum += Sum >> 16;\r
-\r
-  return (UINT16) (~ (UINT16) Sum);\r
-}\r
-\r
-\r
-/**\r
-  Adjust the internet checksum (see RFC 1071) on a single word update.\r
-\r
-  @param  OldChkSum            Checksum previously calculated\r
-  @param  OldWord              Value\r
-  @param  NewWord              New Value\r
-\r
-  @retval Checksum             Returns the 16 bit ones complement of  ones\r
-                               complement sum of 16 bit words\r
-\r
-**/\r
-UINT16\r
-UpdateChecksum (\r
-  IN UINT16 OldChksum,\r
-  IN UINT16 OldWord,\r
-  IN UINT16 NewWord\r
-  )\r
-{\r
-  UINT32  sum;\r
-\r
-  sum = ~OldChksum + NewWord - OldWord;\r
-  //\r
-  // in case above carried\r
-  //\r
-  sum += sum >> 16;\r
-  return (UINT16) (~ (UINT16) sum);\r
-}\r
-\r
-\r
-/**\r
-  See if a callback is in play\r
-\r
-  @param  Private              Pointer to Pxe BaseCode Protocol\r
-\r
-  @retval 0                    Callbacks are active on the handle\r
-  @retval 1                    Callbacks are not active on the handle\r
-\r
-**/\r
-BOOLEAN\r
-SetMakeCallback (\r
-  IN PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  Private->EfiBc.Mode->MakeCallbacks = (BOOLEAN) (gBS->HandleProtocol (\r
-                                                        Private->Handle,\r
-                                                        &gEfiPxeBaseCodeCallbackProtocolGuid,\r
-                                                        (VOID *) &Private->CallbackProtocolPtr\r
-                                                        ) == EFI_SUCCESS);\r
-\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nMode->MakeCallbacks == %d  ",\r
-    Private->EfiBc.Mode->MakeCallbacks)\r
-    );\r
-\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nPrivate->CallbackProtocolPtr == %xh  ",\r
-    Private->CallbackProtocolPtr)\r
-    );\r
-\r
-  if (Private->CallbackProtocolPtr != NULL) {\r
-    DEBUG (\r
-      (DEBUG_INFO,\r
-      "\nCallbackProtocolPtr->Revision = %xh  ",\r
-      Private->CallbackProtocolPtr->Revision)\r
-      );\r
-\r
-    DEBUG (\r
-      (DEBUG_INFO,\r
-      "\nCallbackProtocolPtr->Callback = %xh  ",\r
-      Private->CallbackProtocolPtr->Callback)\r
-      );\r
-  }\r
-\r
-  return Private->EfiBc.Mode->MakeCallbacks;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-  Routine which does an SNP->Receive over a timeout period and doing callbacks\r
-\r
-  @param  Private              Pointer to Pxe BaseCode Protocol\r
-  @param  Function             What PXE function to callback\r
-  @param  TimeoutEvent         Timer event that will trigger when we have waited\r
-                               too  long for an incoming packet\r
-  @param  HeaderSizePtr        Pointer to the size of the Header size\r
-  @param  BufferSizePtr        Pointer to the size of the Buffer size\r
-  @param  ProtocolPtr          The protocol to sniff for (namely, UDP/TCP/etc)\r
-\r
-  @retval 0                    Something was returned\r
-  @retval !0                   Like there was nothing to receive\r
-                               (EFI_TIMEOUT/NOT_READY)\r
-\r
-**/\r
-EFI_STATUS\r
-WaitForReceive (\r
-  IN PXE_BASECODE_DEVICE        *Private,\r
-  IN EFI_PXE_BASE_CODE_FUNCTION Function,\r
-  IN EFI_EVENT                  TimeoutEvent,\r
-  IN OUT UINTN                  *HeaderSizePtr,\r
-  IN OUT UINTN                  *BufferSizePtr,\r
-  IN OUT UINT16                 *ProtocolPtr\r
-  )\r
-{\r
-  EFI_SIMPLE_NETWORK_PROTOCOL *SnpPtr;\r
-  EFI_PXE_CALLBACK            CallbackPtr;\r
-  EFI_STATUS                  StatCode;\r
-  EFI_EVENT                   CallbackEvent;\r
-\r
-  //\r
-  // Initialize pointer to SNP interface\r
-  //\r
-  SnpPtr = Private->SimpleNetwork;\r
-\r
-  //\r
-  // Initialize pointer to PxeBc callback routine - if any\r
-  //\r
-  CallbackPtr = (Private->EfiBc.Mode->MakeCallbacks) ? Private->CallbackProtocolPtr->Callback : NULL;\r
-\r
-  //\r
-  // Create callback event and set timer\r
-  //\r
-  StatCode = gBS->CreateEvent (\r
-                    EVT_TIMER,\r
-                    TPL_CALLBACK,\r
-                    NULL,\r
-                    NULL,\r
-                    &CallbackEvent\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  //\r
-  // every 100 milliseconds\r
-  //\r
-  StatCode = gBS->SetTimer (\r
-                    CallbackEvent,\r
-                    TimerPeriodic,\r
-                    1000000\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    gBS->CloseEvent (CallbackEvent);\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  //\r
-  // Loop until a packet is received or a receive error is detected or\r
-  // a callback abort is detected or a timeout event occurs.\r
-  //\r
-  for (;;)\r
-  {\r
-    //\r
-    // Poll for received packet.\r
-    //\r
-    *BufferSizePtr = BUFFER_ALLOCATE_SIZE;\r
-\r
-    StatCode = SnpPtr->Receive (\r
-                        SnpPtr,\r
-                        HeaderSizePtr,\r
-                        BufferSizePtr,\r
-                        Private->ReceiveBufferPtr,\r
-                        0,\r
-                        0,\r
-                        ProtocolPtr\r
-                        );\r
-\r
-    if (!EFI_ERROR (StatCode)) {\r
-      //\r
-      // Packet was received.  Make received callback then return.\r
-      //\r
-      if (CallbackPtr != NULL) {\r
-        StatCode = CallbackPtr (\r
-                    Private->CallbackProtocolPtr,\r
-                    Function,\r
-                    TRUE,\r
-                    (UINT32) *BufferSizePtr,\r
-                    (EFI_PXE_BASE_CODE_PACKET *) Private->ReceiveBufferPtr\r
-                    );\r
-\r
-        if (StatCode != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {\r
-          StatCode = EFI_ABORTED;\r
-        } else {\r
-          StatCode = EFI_SUCCESS;\r
-        }\r
-      }\r
-\r
-      break;\r
-    }\r
-\r
-    if (StatCode != EFI_NOT_READY) {\r
-      break;\r
-    }\r
-    //\r
-    // Check for callback event.\r
-    //\r
-    if (!EFI_ERROR (gBS->CheckEvent (CallbackEvent))) {\r
-      //\r
-      // Make periodic callback if callback pointer is initialized.\r
-      //\r
-      if (CallbackPtr != NULL) {\r
-        StatCode = CallbackPtr (\r
-                    Private->CallbackProtocolPtr,\r
-                    Function,\r
-                    FALSE,\r
-                    0,\r
-                    NULL\r
-                    );\r
-\r
-        //\r
-        // Abort if directed to by callback routine.\r
-        //\r
-        if (StatCode != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {\r
-          StatCode = EFI_ABORTED;\r
-          break;\r
-        }\r
-      }\r
-    }\r
-    //\r
-    // Check for timeout event.\r
-    //\r
-    if (TimeoutEvent == 0) {\r
-      StatCode = EFI_TIMEOUT;\r
-      break;\r
-    }\r
-\r
-    if (!EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {\r
-      StatCode = EFI_TIMEOUT;\r
-      break;\r
-    }\r
-    //\r
-    // Check IGMP timer events.\r
-    //\r
-    IgmpCheckTimers (Private);\r
-  }\r
-\r
-  gBS->CloseEvent (CallbackEvent);\r
-\r
-  return StatCode;\r
-}\r
-\r
-\r
-/**\r
-  Routine which does an SNP->Transmit of a buffer\r
-\r
-  @param  Private              Pointer to Pxe BaseCode Protocol\r
-  @param  HeaderPtr            Pointer to the buffer\r
-  @param  PacketPtr            Pointer to the packet to send\r
-  @param  PacketLen            The length of the entire packet to send\r
-  @param  HardwareAddr         Pointer to the MAC address of the destination\r
-  @param  MediaProtocol        What type of frame to create (RFC 1700) - IE.\r
-                               Ethernet\r
-  @param  Function             What PXE function to callback\r
-\r
-  @retval 0                    Something was sent\r
-  @retval !0                   An error was encountered during sending of a packet\r
-\r
-**/\r
-EFI_STATUS\r
-SendPacket (\r
-  PXE_BASECODE_DEVICE           *Private,\r
-  VOID                          *HeaderPtr,\r
-  VOID                          *PacketPtr,\r
-  INTN                          PacketLen,\r
-  VOID                          *HardwareAddr,\r
-  UINT16                        MediaProtocol,\r
-  IN EFI_PXE_BASE_CODE_FUNCTION Function\r
-  )\r
-{\r
-  EFI_SIMPLE_NETWORK_PROTOCOL *SnpPtr;\r
-  EFI_SIMPLE_NETWORK_MODE     *SnpModePtr;\r
-  EFI_PXE_CALLBACK            CallbackPtr;\r
-  EFI_STATUS                  StatCode;\r
-  EFI_EVENT                   TimeoutEvent;\r
-  UINT32                      IntStatus;\r
-  VOID                        *TxBuf;\r
-\r
-  //\r
-  //\r
-  //\r
-  CallbackPtr = Private->EfiBc.Mode->MakeCallbacks ? Private->CallbackProtocolPtr->Callback : 0;\r
-\r
-  SnpPtr      = Private->SimpleNetwork;\r
-  SnpModePtr  = SnpPtr->Mode;\r
-\r
-  //\r
-  // clear prior interrupt status\r
-  //\r
-  StatCode = SnpPtr->GetStatus (SnpPtr, &IntStatus, 0);\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nSendPacket()  Exit #1  %xh (%r)",\r
-      StatCode,\r
-      StatCode)\r
-      );\r
-    return StatCode;\r
-  }\r
-\r
-  Private->DidTransmit = FALSE;\r
-\r
-  if (CallbackPtr != NULL) {\r
-    if (CallbackPtr (\r
-          Private->CallbackProtocolPtr,\r
-          Function,\r
-          FALSE,\r
-          (UINT32) PacketLen,\r
-          PacketPtr\r
-          ) != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {\r
-      DEBUG (\r
-        (DEBUG_WARN,\r
-        "\nSendPacket()  Exit #2  %xh (%r)",\r
-        EFI_ABORTED,\r
-        EFI_ABORTED)\r
-        );\r
-      return EFI_ABORTED;\r
-    }\r
-  }\r
-  //\r
-  // put packet in transmit queue\r
-  // headersize should be zero if not filled in\r
-  //\r
-  StatCode = gBS->CreateEvent (\r
-                    EVT_TIMER,\r
-                    TPL_CALLBACK,\r
-                    NULL,\r
-                    NULL,\r
-                    &TimeoutEvent\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    DEBUG (\r
-      (DEBUG_ERROR,\r
-      "Could not create transmit timeout event.  %r\n",\r
-      StatCode)\r
-      );\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  //\r
-  // 5 milliseconds\r
-  //\r
-  StatCode = gBS->SetTimer (\r
-                    TimeoutEvent,\r
-                    TimerRelative,\r
-                    50000\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    DEBUG (\r
-      (DEBUG_ERROR,\r
-      "Could not set transmit timeout event timer.  %r\n",\r
-      StatCode)\r
-      );\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  for (;;) {\r
-    StatCode = SnpPtr->Transmit (\r
-                        SnpPtr,\r
-                        (UINTN) SnpPtr->Mode->MediaHeaderSize,\r
-                        (UINTN) (PacketLen + SnpPtr->Mode->MediaHeaderSize),\r
-                        HeaderPtr,\r
-                        &SnpModePtr->CurrentAddress,\r
-                        (EFI_MAC_ADDRESS *) HardwareAddr,\r
-                        &MediaProtocol\r
-                        );\r
-\r
-    if (StatCode != EFI_NOT_READY) {\r
-      break;\r
-    }\r
-\r
-    if (!EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {\r
-      StatCode = EFI_TIMEOUT;\r
-      break;\r
-    }\r
-  }\r
-\r
-  gBS->CloseEvent (TimeoutEvent);\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nSendPacket()  Exit #3  %xh (%r)",\r
-      StatCode,\r
-      StatCode)\r
-      );\r
-    return StatCode;\r
-  }\r
-  //\r
-  // remove transmit buffer from snp's unused queue\r
-  // done this way in case someday things are buffered and we don't get it back\r
-  // immediately\r
-  //\r
-  StatCode = gBS->CreateEvent (\r
-                    EVT_TIMER,\r
-                    TPL_CALLBACK,\r
-                    NULL,\r
-                    NULL,\r
-                    &TimeoutEvent\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    DEBUG (\r
-      (DEBUG_ERROR,\r
-      "Could not create transmit status timeout event.  %r\n",\r
-      StatCode)\r
-      );\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  //\r
-  // 5 milliseconds\r
-  //\r
-  StatCode = gBS->SetTimer (\r
-                    TimeoutEvent,\r
-                    TimerRelative,\r
-                    50000\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    DEBUG (\r
-      (DEBUG_ERROR,\r
-      "Could not set transmit status timeout event timer.  %r\n",\r
-      StatCode)\r
-      );\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  for (;;) {\r
-    StatCode = SnpPtr->GetStatus (SnpPtr, &IntStatus, &TxBuf);\r
-\r
-    if (EFI_ERROR (StatCode)) {\r
-      DEBUG (\r
-        (DEBUG_WARN,\r
-        "\nSendPacket()  Exit #4  %xh (%r)",\r
-        StatCode,\r
-        StatCode)\r
-        );\r
-      break;\r
-    }\r
-\r
-    if (IntStatus & EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT) {\r
-      Private->DidTransmit = TRUE;\r
-    }\r
-\r
-    if (TxBuf != NULL) {\r
-      break;\r
-    }\r
-\r
-    if (!EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {\r
-      StatCode = EFI_TIMEOUT;\r
-      break;\r
-    }\r
-  }\r
-\r
-  gBS->CloseEvent (TimeoutEvent);\r
-\r
-  return StatCode;\r
-}\r
-//\r
-//\r
-//\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_BIS_PROTOCOL *\r
-PxebcBisStart (\r
-  IN PXE_BASECODE_DEVICE      *Private,\r
-  OUT BIS_APPLICATION_HANDLE  *BisAppHandle,\r
-  OUT OPTIONAL EFI_BIS_DATA            **BisDataSigInfo\r
-  )\r
-{\r
-  EFI_STATUS        EfiStatus;\r
-  EFI_HANDLE        BisHandleBuffer;\r
-  UINTN             BisHandleCount;\r
-  EFI_BIS_PROTOCOL  *BisPtr;\r
-  EFI_BIS_VERSION   BisInterfaceVersion;\r
-  BOOLEAN           BisCheckFlag;\r
-\r
-  BisHandleCount  = sizeof (EFI_HANDLE);\r
-  BisCheckFlag    = FALSE;\r
-\r
-  //\r
-  // Locate BIS protocol handle (if present).\r
-  // If BIS protocol handle is not found, return NULL.\r
-  //\r
-  DEBUG ((DEBUG_INFO, "\ngBS->LocateHandle()  "));\r
-\r
-  EfiStatus = gBS->LocateHandle (\r
-                    ByProtocol,\r
-                    &gEfiBisProtocolGuid,\r
-                    NULL,\r
-                    &BisHandleCount,\r
-                    &BisHandleBuffer\r
-                    );\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    //\r
-    // Any error means that there is no BIS.\r
-    // Note - It could mean that there are more than\r
-    // one BIS protocols installed, but that scenario\r
-    // is not yet supported.\r
-    //\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nPxebcBisStart()""\n  gBS->LocateHandle()  %r (%xh)\n",\r
-      EfiStatus,\r
-      EfiStatus)\r
-      );\r
-\r
-    return NULL;\r
-  }\r
-\r
-  if (BisHandleCount != sizeof BisHandleBuffer) {\r
-    //\r
-    // This really should never happen, but I am paranoid.\r
-    //\r
-    DEBUG (\r
-      (DEBUG_NET,\r
-      "\nPxebcBisStart()  BisHandleCount != %d\n",\r
-      sizeof BisHandleBuffer)\r
-      );\r
-\r
-    return NULL;\r
-  }\r
-\r
-  DEBUG ((DEBUG_INFO, "BIS handle found."));\r
-\r
-  //\r
-  // Locate BIS protocol interface.\r
-  // If the BIS protocol interface cannot be found, return NULL.\r
-  //\r
-  DEBUG ((DEBUG_INFO, "\ngBS->HandleProtocol()  "));\r
-\r
-  EfiStatus = gBS->HandleProtocol (\r
-                    BisHandleBuffer,\r
-                    &gEfiBisProtocolGuid,\r
-                    (VOID **) &BisPtr\r
-                    );\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nPxebcBisStart()""\n  gBS->HandleProtocol()  %r (%xh)\n",\r
-      EfiStatus,\r
-      EfiStatus)\r
-      );\r
-\r
-    return NULL;\r
-  }\r
-\r
-  if (BisPtr == NULL) {\r
-    //\r
-    // This really should never happen.\r
-    //\r
-    DEBUG (\r
-      (DEBUG_NET,\r
-      "\nPxebcBisStart()""\n  gBS->HandleProtocoL()  ""BIS protocol interface pointer is NULL!\n")\r
-      );\r
-\r
-    return NULL;\r
-  }\r
-\r
-  DEBUG ((DEBUG_INFO, "BIS protocol interface found."));\r
-\r
-  //\r
-  // Check that all of the BIS API function pointers are not NULL.\r
-  //\r
-  if (BisPtr->Initialize == NULL ||\r
-      BisPtr->Shutdown == NULL ||\r
-      BisPtr->Free == NULL ||\r
-      BisPtr->GetBootObjectAuthorizationCertificate == NULL ||\r
-      BisPtr->GetBootObjectAuthorizationCheckFlag == NULL ||\r
-      BisPtr->GetBootObjectAuthorizationUpdateToken == NULL ||\r
-      BisPtr->GetSignatureInfo == NULL ||\r
-      BisPtr->UpdateBootObjectAuthorization == NULL ||\r
-      BisPtr->VerifyBootObject == NULL ||\r
-      BisPtr->VerifyObjectWithCredential == NULL\r
-      ) {\r
-    DEBUG (\r
-      (\r
-      DEBUG_NET,\r
-      "\nPxebcBisStart()""\n  BIS protocol interface is invalid."\r
-      "\n  At least one BIS protocol function pointer is NULL.\n"\r
-      )\r
-      );\r
-\r
-    return NULL;\r
-  }\r
-  //\r
-  // Initialize BIS.\r
-  // If BIS does not initialize, return NULL.\r
-  //\r
-  DEBUG ((DEBUG_INFO, "\nBisPtr->Initialize()  "));\r
-\r
-  BisInterfaceVersion.Major = BIS_VERSION_1;\r
-\r
-  EfiStatus = BisPtr->Initialize (\r
-                        BisPtr,\r
-                        BisAppHandle,\r
-                        &BisInterfaceVersion,\r
-                        NULL\r
-                        );\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nPxebcBisStart()""\n  BisPtr->Initialize()  %r (%xh)\n",\r
-      EfiStatus,\r
-      EfiStatus)\r
-      );\r
-\r
-    return NULL;\r
-  }\r
-\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "  BIS version: %d.%d",\r
-    BisInterfaceVersion.Major,\r
-    BisInterfaceVersion.Minor)\r
-    );\r
-\r
-  //\r
-  // If the requested BIS API version is not supported,\r
-  // shutdown BIS and return NULL.\r
-  //\r
-  if (BisInterfaceVersion.Major != BIS_VERSION_1) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nPxebcBisStart()""\n  BIS version %d.%d not supported by PXE BaseCode.\n",\r
-      BisInterfaceVersion.Major,\r
-      BisInterfaceVersion.Minor)\r
-      );\r
-\r
-    BisPtr->Shutdown (*BisAppHandle);\r
-    return NULL;\r
-  }\r
-  //\r
-  // Get BIS check flag.\r
-  // If the BIS check flag cannot be read, shutdown BIS and return NULL.\r
-  //\r
-  DEBUG ((DEBUG_INFO, "\nBisPtr->GetBootObjectAuthorizationCheckFlag()  "));\r
-\r
-  EfiStatus = BisPtr->GetBootObjectAuthorizationCheckFlag (*BisAppHandle, &BisCheckFlag);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nPxebcBisStart()""\n  BisPtr->GetBootObjectAuthorizationCheckFlag()  %r (%xh)\n",\r
-      EfiStatus,\r
-      EfiStatus)\r
-      );\r
-\r
-    BisPtr->Shutdown (*BisAppHandle);\r
-    return NULL;\r
-  }\r
-  //\r
-  // If the BIS check flag is FALSE, shutdown BIS and return NULL.\r
-  //\r
-  if (!BisCheckFlag) {\r
-    DEBUG ((DEBUG_INFO, "\nBIS check flag is FALSE.\n"));\r
-    BisPtr->Shutdown (*BisAppHandle);\r
-    return NULL;\r
-  } else {\r
-    DEBUG ((DEBUG_INFO, "\nBIS check flag is TRUE."));\r
-  }\r
-  //\r
-  // Early out if caller does not want signature information.\r
-  //\r
-  if (BisDataSigInfo == NULL) {\r
-    return BisPtr;\r
-  }\r
-  //\r
-  // Get BIS signature information.\r
-  // If the signature information cannot be read or is invalid,\r
-  // shutdown BIS and return NULL.\r
-  //\r
-  DEBUG ((DEBUG_INFO, "\nBisPtr->GetSignatureInfo()  "));\r
-\r
-  EfiStatus = BisPtr->GetSignatureInfo (*BisAppHandle, BisDataSigInfo);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nPxebcBisStart()""\n  BisPtr_GetSignatureInfo()  %r (%xh)\n",\r
-      EfiStatus,\r
-      EfiStatus)\r
-      );\r
-\r
-    BisPtr->Shutdown (*BisAppHandle);\r
-    return NULL;\r
-  }\r
-\r
-  if (*BisDataSigInfo == NULL) {\r
-    //\r
-    // This should never happen.\r
-    //\r
-    DEBUG (\r
-      (DEBUG_NET,\r
-      "\nPxebcBisStart()""\n  BisPtr->GetSignatureInfo()  Data pointer is NULL!\n")\r
-      );\r
-\r
-    BisPtr->Shutdown (*BisAppHandle);\r
-    return NULL;\r
-  }\r
-\r
-  if ((*BisDataSigInfo)->Length < sizeof (EFI_BIS_SIGNATURE_INFO) ||\r
-      (*BisDataSigInfo)->Length % sizeof (EFI_BIS_SIGNATURE_INFO) ||\r
-      (*BisDataSigInfo)->Length > sizeof (EFI_BIS_SIGNATURE_INFO) * 63\r
-      ) {\r
-    //\r
-    // This should never happen.\r
-    //\r
-    DEBUG (\r
-      (DEBUG_NET,\r
-      "\nPxebcBisStart()""\n  BisPtr->GetSignatureInfo()  Invalid BIS siginfo length.\n")\r
-      );\r
-\r
-    BisPtr->Free (*BisAppHandle, *BisDataSigInfo);\r
-    BisPtr->Shutdown (*BisAppHandle);\r
-    return NULL;\r
-  }\r
-\r
-  return BisPtr;\r
-}\r
-\r
-\r
-/**\r
-\r
-\r
-**/\r
-VOID\r
-PxebcBisStop (\r
-  EFI_BIS_PROTOCOL        *BisPtr,\r
-  BIS_APPLICATION_HANDLE  BisAppHandle,\r
-  EFI_BIS_DATA            *BisDataSigInfo\r
-  )\r
-{\r
-  if (BisPtr == NULL) {\r
-    return ;\r
-  }\r
-  //\r
-  // Free BIS allocated resources and shutdown BIS.\r
-  // Return TRUE - BIS support is officially detected.\r
-  //\r
-  if (BisDataSigInfo != NULL) {\r
-    BisPtr->Free (BisAppHandle, BisDataSigInfo);\r
-  }\r
-\r
-  BisPtr->Shutdown (BisAppHandle);\r
-}\r
-\r
-\r
-/**\r
-\r
-  @return TRUE := verified\r
-  @return FALSE := not verified\r
-\r
-**/\r
-BOOLEAN\r
-PxebcBisVerify (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  VOID                *FileBuffer,\r
-  UINTN               FileLength,\r
-  VOID                *CredentialBuffer,\r
-  UINTN               CredentialLength\r
-  )\r
-{\r
-  EFI_BIS_PROTOCOL        *BisPtr;\r
-  BIS_APPLICATION_HANDLE  BisAppHandle;\r
-  EFI_BIS_DATA            FileData;\r
-  EFI_BIS_DATA            CredentialData;\r
-  EFI_STATUS              EfiStatus;\r
-  BOOLEAN                 IsVerified;\r
-\r
-  if (Private == NULL || FileBuffer == NULL || FileLength == 0 || CredentialBuffer == NULL || CredentialLength == 0) {\r
-    return FALSE;\r
-  }\r
-\r
-  BisPtr = PxebcBisStart (Private, &BisAppHandle, NULL);\r
-\r
-  if (BisPtr == NULL) {\r
-    return FALSE;\r
-  }\r
-\r
-  FileData.Length       = (UINT32) FileLength;\r
-  FileData.Data         = FileBuffer;\r
-  CredentialData.Length = (UINT32) CredentialLength;\r
-  CredentialData.Data   = CredentialBuffer;\r
-\r
-  EfiStatus = BisPtr->VerifyBootObject (\r
-                        BisAppHandle,\r
-                        &CredentialData,\r
-                        &FileData,\r
-                        &IsVerified\r
-                        );\r
-\r
-  PxebcBisStop (BisPtr, BisAppHandle, NULL);\r
-\r
-  return (BOOLEAN) ((EFI_ERROR (EfiStatus)) ? FALSE : (IsVerified ? TRUE : FALSE));\r
-}\r
-\r
-\r
-/**\r
-\r
-  @return TRUE := BIS present\r
-  @return FALSE := BIS not present\r
-\r
-**/\r
-BOOLEAN\r
-PxebcBisDetect (\r
-  PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  EFI_BIS_PROTOCOL        *BisPtr;\r
-  BIS_APPLICATION_HANDLE  BisAppHandle;\r
-  EFI_BIS_DATA            *BisDataSigInfo;\r
-\r
-  BisPtr = PxebcBisStart (Private, &BisAppHandle, &BisDataSigInfo);\r
-\r
-  if (BisPtr == NULL) {\r
-    return FALSE;\r
-  }\r
-\r
-  PxebcBisStop (BisPtr, BisAppHandle, BisDataSigInfo);\r
-\r
-  return TRUE;\r
-}\r
-\r
-/**\r
-  Start and initialize the BaseCode protocol, Simple Network protocol and UNDI.\r
-\r
-  @param  Private              Pointer to Pxe BaseCode Protocol\r
-  @param  UseIPv6              Do we want to support IPv6?\r
-\r
-  @return EFI_SUCCESS\r
-  @return EFI_INVALID_PARAMETER\r
-  @return EFI_UNSUPPORTED\r
-  @return EFI_ALREADY_STARTED\r
-  @return EFI_OUT_OF_RESOURCES\r
-  @return Status is also returned from SNP.Start() and SNP.Initialize().\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcStart (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL *This,\r
-  IN BOOLEAN                    UseIPv6\r
-  )\r
-{\r
-  EFI_SIMPLE_NETWORK_PROTOCOL *SnpPtr;\r
-  EFI_SIMPLE_NETWORK_MODE     *SnpModePtr;\r
-  EFI_STATUS                  Status;\r
-  EFI_STATUS                  StatCode;\r
-  PXE_BASECODE_DEVICE         *Private;\r
-\r
-  //\r
-  // Lock the instance data\r
-  //\r
-  StatCode = EFI_SUCCESS;\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  //\r
-  // Make sure BaseCode is not already started.\r
-  //\r
-  if (This->Mode->Started) {\r
-    DEBUG ((DEBUG_WARN, "\nBcStart()  BC is already started.\n"));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_ALREADY_STARTED;\r
-  }\r
-\r
-  //\r
-  // Fail if IPv6 is requested and not supported.\r
-  //\r
-  if (UseIPv6) {\r
-    DEBUG ((DEBUG_WARN, "\nBcStart()  IPv6 is not supported.\n"));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-  //\r
-  // Setup shortcuts to SNP protocol and data structure.\r
-  //\r
-  SnpPtr      = Private->SimpleNetwork;\r
-  SnpModePtr  = SnpPtr->Mode;\r
-\r
-  //\r
-  // Start and initialize SNP.\r
-  //\r
-  if (SnpModePtr->State == EfiSimpleNetworkStopped) {\r
-    StatCode = (*SnpPtr->Start) (SnpPtr);\r
-\r
-    if (SnpModePtr->State != EfiSimpleNetworkStarted) {\r
-      DEBUG ((DEBUG_WARN, "\nBcStart()  Could not start SNP.\n"));\r
-      EfiReleaseLock (&Private->Lock);\r
-      return StatCode;\r
-    }\r
-  }\r
-  //\r
-  // acquire memory for mode and transmit/receive buffers\r
-  //\r
-  if (SnpModePtr->State == EfiSimpleNetworkStarted) {\r
-    StatCode = (*SnpPtr->Initialize) (SnpPtr, 0, 0);\r
-\r
-    if (SnpModePtr->State != EfiSimpleNetworkInitialized) {\r
-      DEBUG ((DEBUG_WARN, "\nBcStart()  Could not initialize SNP."));\r
-      EfiReleaseLock (&Private->Lock);\r
-      return StatCode;\r
-    }\r
-  }\r
-  //\r
-  // Dump debug info.\r
-  //\r
-  DEBUG ((DEBUG_INFO, "\nBC Start()"));\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->State                    %Xh",\r
-    SnpModePtr->State)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->HwAddressSize            %Xh",\r
-    SnpModePtr->HwAddressSize)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->MediaHeaderSize          %Xh",\r
-    SnpModePtr->MediaHeaderSize)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->MaxPacketSize            %Xh",\r
-    SnpModePtr->MaxPacketSize)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->MacAddressChangeable     %Xh",\r
-    SnpModePtr->MacAddressChangeable)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->MultipleTxSupported      %Xh",\r
-    SnpModePtr->MultipleTxSupported)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->CurrentAddress           %Xh",\r
-     *((UINTN *)&SnpModePtr->CurrentAddress))\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->BroadcastAddress         %Xh",\r
-    *((UINTN *)&SnpModePtr->BroadcastAddress))\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->PermanentAddress         %Xh",\r
-    *((UINTN *)&SnpModePtr->PermanentAddress))\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->NvRamSize                %Xh",\r
-    SnpModePtr->NvRamSize)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->NvRamAccessSize          %Xh",\r
-    SnpModePtr->NvRamAccessSize)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->ReceiveFilterMask        %Xh",\r
-    SnpModePtr->ReceiveFilterMask)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->ReceiveFilterSetting     %Xh",\r
-    SnpModePtr->ReceiveFilterSetting)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->MCastFilterCount         %Xh",\r
-    SnpModePtr->MCastFilterCount)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->MCastFilter              %Xh",\r
-    SnpModePtr->MCastFilter)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->IfType                   %Xh",\r
-    SnpModePtr->IfType)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->MediaPresentSupported    %Xh",\r
-    SnpModePtr->MediaPresentSupported)\r
-    );\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nSnpModePtr->MediaPresent             %Xh",\r
-    SnpModePtr->MediaPresent)\r
-    );\r
-\r
-  //\r
-  // If media check is supported and there is no media,\r
-  // return error to caller.\r
-  //\r
-  if (SnpModePtr->MediaPresentSupported && !SnpModePtr->MediaPresent) {\r
-    DEBUG ((DEBUG_WARN, "\nBcStart()  Media not present.\n"));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_NO_MEDIA;\r
-  }\r
-  //\r
-  // Allocate Tx/Rx buffers\r
-  //\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  BUFFER_ALLOCATE_SIZE,\r
-                  (VOID **) &Private->TransmitBufferPtr\r
-                  );\r
-\r
-  if (!EFI_ERROR (Status)) {\r
-    ZeroMem (Private->TransmitBufferPtr, BUFFER_ALLOCATE_SIZE);\r
-  } else {\r
-    DEBUG ((DEBUG_NET, "\nBcStart()  Could not alloc TxBuf.\n"));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  BUFFER_ALLOCATE_SIZE,\r
-                  (VOID **) &Private->ReceiveBufferPtr\r
-                  );\r
-\r
-  if (!EFI_ERROR (Status)) {\r
-    ZeroMem (Private->ReceiveBufferPtr, BUFFER_ALLOCATE_SIZE);\r
-  } else {\r
-    DEBUG ((DEBUG_NET, "\nBcStart()  Could not alloc RxBuf.\n"));\r
-    gBS->FreePool (Private->TransmitBufferPtr);\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  256,\r
-                  (VOID **) &Private->TftpErrorBuffer\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->FreePool (Private->ReceiveBufferPtr);\r
-    gBS->FreePool (Private->TransmitBufferPtr);\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  Status = gBS->AllocatePool (EfiBootServicesData, 256, (VOID **) &Private->TftpAckBuffer);\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->FreePool (Private->TftpErrorBuffer);\r
-    gBS->FreePool (Private->ReceiveBufferPtr);\r
-    gBS->FreePool (Private->TransmitBufferPtr);\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  //\r
-  // Initialize private BaseCode instance data\r
-  //\r
-  do {\r
-    Private->RandomPort = (UINT16) (Private->RandomPort + PXE_RND_PORT_LOW + Random (Private));\r
-  } while (Private->RandomPort < PXE_RND_PORT_LOW);\r
-\r
-  Private->Igmpv1TimeoutEvent = NULL;\r
-  Private->UseIgmpv1Reporting = TRUE;\r
-  Private->IpLength           = IP_ADDRESS_LENGTH (Private->EfiBc.Mode);\r
-\r
-  //\r
-  // Initialize Mode structure\r
-  //\r
-  ZeroMem (Private->EfiBc.Mode, sizeof (EFI_PXE_BASE_CODE_MODE));\r
-  //\r
-  // check for callback protocol and set boolean\r
-  //\r
-  SetMakeCallback (Private);\r
-  Private->EfiBc.Mode->Started              = TRUE;\r
-  Private->EfiBc.Mode->TTL                  = DEFAULT_TTL;\r
-  Private->EfiBc.Mode->ToS                  = DEFAULT_ToS;\r
-  Private->EfiBc.Mode->UsingIpv6            = UseIPv6;\r
-\r
-  //\r
-  // Set to PXE_TRUE by the BC constructor if this BC implementation\r
-  // supports IPv6.\r
-  //\r
-  Private->EfiBc.Mode->Ipv6Supported = SUPPORT_IPV6;\r
-\r
-  Private->EfiBc.Mode->Ipv6Available = FALSE;\r
-  //\r
-  // Set to TRUE by the BC constructor if this BC implementation\r
-  // supports BIS.\r
-  //\r
-  Private->EfiBc.Mode->BisSupported = TRUE;\r
-  Private->EfiBc.Mode->BisDetected  = PxebcBisDetect (Private);\r
-\r
-  //\r
-  // This field is set to PXE_TRUE by the BC Start() function.  When this\r
-  // field is PXE_TRUE, ARP packets are sent as needed to get IP and MAC\r
-  // addresses.  This can cause unexpected delays in the DHCP(), Discover()\r
-  // and MTFTP() functions.  Setting this to PXE_FALSE will cause these\r
-  // functions to fail if the required IP/MAC information is not in the\r
-  // ARP cache.  The value of this field can be changed by an application\r
-  // at any time.\r
-  //\r
-  Private->EfiBc.Mode->AutoArp = TRUE;\r
-\r
-  //\r
-  // Unlock the instance data\r
-  //\r
-  EfiReleaseLock (&Private->Lock);\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Stop the BaseCode protocol, Simple Network protocol and UNDI.\r
-\r
-  @param  Private              Pointer to Pxe BaseCode Protocol\r
-\r
-  @retval 0                    Successfully stopped\r
-  @retval !0                   Failed\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcStop (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL *This\r
-  )\r
-{\r
-  //\r
-  // Lock the instance data\r
-  //\r
-  EFI_SIMPLE_NETWORK_PROTOCOL *SnpPtr;\r
-  EFI_SIMPLE_NETWORK_MODE     *SnpModePtr;\r
-  EFI_STATUS                  StatCode;\r
-  PXE_BASECODE_DEVICE         *Private;\r
-\r
-  StatCode = EFI_SUCCESS;\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE poiner == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  SnpPtr      = Private->SimpleNetwork;\r
-  SnpModePtr  = SnpPtr->Mode;\r
-\r
-  //\r
-  // Issue BC command\r
-  //\r
-  StatCode = EFI_NOT_STARTED;\r
-\r
-  if (SnpModePtr->State == EfiSimpleNetworkInitialized) {\r
-    StatCode = (*SnpPtr->Shutdown) (SnpPtr);\r
-  }\r
-\r
-  if (SnpModePtr->State == EfiSimpleNetworkStarted) {\r
-    StatCode = (*SnpPtr->Stop) (SnpPtr);\r
-  }\r
-\r
-  if (Private->TransmitBufferPtr != NULL) {\r
-    gBS->FreePool (Private->TransmitBufferPtr);\r
-    Private->TransmitBufferPtr = NULL;\r
-  }\r
-\r
-  if (Private->ReceiveBufferPtr != NULL) {\r
-    gBS->FreePool (Private->ReceiveBufferPtr);\r
-    Private->ReceiveBufferPtr = NULL;\r
-  }\r
-\r
-  if (Private->ArpBuffer != NULL) {\r
-    gBS->FreePool (Private->ArpBuffer);\r
-    Private->ArpBuffer = NULL;\r
-  }\r
-\r
-  if (Private->TftpErrorBuffer != NULL) {\r
-    gBS->FreePool (Private->TftpErrorBuffer);\r
-    Private->TftpErrorBuffer = NULL;\r
-  }\r
-\r
-  if (Private->TftpAckBuffer != NULL) {\r
-    gBS->FreePool (Private->TftpAckBuffer);\r
-    Private->TftpAckBuffer = NULL;\r
-  }\r
-\r
-  if (Private->Igmpv1TimeoutEvent != NULL) {\r
-    gBS->CloseEvent (Private->Igmpv1TimeoutEvent);\r
-    Private->Igmpv1TimeoutEvent = NULL;\r
-  }\r
-\r
-  Private->FileSize             = 0;\r
-\r
-  if (!Private->EfiBc.Mode->Started) {\r
-    StatCode = EFI_NOT_STARTED;\r
-  } else {\r
-    Private->EfiBc.Mode->Started = FALSE;\r
-  }\r
-\r
-  //\r
-  // Unlock the instance data\r
-  //\r
-  EfiReleaseLock (&Private->Lock);\r
-  return StatCode;\r
-}\r
-\r
-const IPV4_ADDR AllSystemsGroup = {{224, 0, 0, 1}};\r
-\r
-\r
-/**\r
-  Set up the IP filter\r
-\r
-  @param  Private              Pointer to Pxe BaseCode Protocol\r
-  @param  Filter               Pointer to the filter\r
-\r
-  @retval 0                    Successfully set the filter\r
-  @retval !0                   Failed\r
-\r
-**/\r
-EFI_STATUS\r
-IpFilter (\r
-  IN PXE_BASECODE_DEVICE          *Private,\r
-  IN EFI_PXE_BASE_CODE_IP_FILTER  *Filter\r
-  )\r
-{\r
-  EFI_STATUS                  StatCode;\r
-  EFI_MAC_ADDRESS             MACadds[PXE_IP_FILTER_SIZE];\r
-  EFI_PXE_BASE_CODE_MODE      *PxebcMode;\r
-  EFI_SIMPLE_NETWORK_PROTOCOL *SnpPtr;\r
-  EFI_SIMPLE_NETWORK_MODE     *SnpModePtr;\r
-  UINT32                      Enable;\r
-  UINT32                      Disable;\r
-  UINTN                       Index;\r
-  UINTN                       Index2;\r
-\r
-  PxebcMode   = Private->EfiBc.Mode;\r
-  SnpPtr      = Private->SimpleNetwork;\r
-  SnpModePtr  = SnpPtr->Mode;\r
-\r
-  //\r
-  // validate input parameters\r
-  // must have a filter\r
-  // must not have any extra filter bits set\r
-  //\r
-  if (Filter == NULL ||\r
-      (Filter->Filters &~FILTER_BITS)\r
-      //\r
-      // must not have a count which is too large or with no IP list\r
-      //\r
-      ||\r
-      (Filter->IpCnt && (!Filter->IpList || Filter->IpCnt > PXE_IP_FILTER_SIZE))\r
-      //\r
-      // must not have incompatible filters - promiscuous incompatible with anything else\r
-      //\r
-      ||\r
-      (\r
-        (Filter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) &&\r
-      ((Filter->Filters &~EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) || Filter->IpCnt)\r
-    )\r
-      ) {\r
-    DEBUG ((DEBUG_INFO, "\nIpFilter()  Exit #1"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // promiscuous multicast incompatible with multicast in IP list\r
-  //\r
-  if (Filter->IpCnt && (Filter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST)) {\r
-    for (Index = 0; Index < Filter->IpCnt; ++Index) {\r
-      if (IS_MULTICAST (&Filter->IpList[Index])) {\r
-        DEBUG ((DEBUG_INFO, "\nIpFilter()  Exit #2"));\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    }\r
-  }\r
-  //\r
-  // leave groups for all those multicast which are no longer enabled\r
-  //\r
-  for (Index = 0; Index < PxebcMode->IpFilter.IpCnt; ++Index) {\r
-    if (!IS_MULTICAST (&PxebcMode->IpFilter.IpList[Index])) {\r
-      continue;\r
-    }\r
-\r
-    for (Index2 = 0; Index2 < Filter->IpCnt; ++Index2) {\r
-      if (!CompareMem (&PxebcMode->IpFilter.IpList[Index], &Filter->IpList[Index2], IP_ADDRESS_LENGTH (PxebcMode))) {\r
-        //\r
-        // still enabled\r
-        //\r
-        break;\r
-      }\r
-    }\r
-    //\r
-    // if we didn't find it, remove from group\r
-    //\r
-    if (Index2 == Filter->IpCnt) {\r
-      IgmpLeaveGroup (Private, &PxebcMode->IpFilter.IpList[Index]);\r
-    }\r
-  }\r
-  //\r
-  // set enable bits, convert multicast ip adds, join groups\r
-  // allways leave receive broadcast enabled at hardware layer\r
-  //\r
-  Index2 = 0;\r
-\r
-  if (Filter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) {\r
-    Enable = EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS;\r
-  } else {\r
-    if (Filter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) {\r
-      Enable = EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;\r
-    } else {\r
-      Enable = EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST;\r
-\r
-      for (Index = 0; Index < Filter->IpCnt; ++Index) {\r
-        CopyMem (&PxebcMode->IpFilter.IpList[Index], &Filter->IpList[Index], sizeof (EFI_IP_ADDRESS));\r
-\r
-        if (IS_MULTICAST (&Filter->IpList[Index])) {\r
-          EFI_IP_ADDRESS  *TmpIp;\r
-\r
-          Enable |= EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST;\r
-\r
-          //\r
-          // if this is the first group, add the all systems group to mcast list\r
-          //\r
-          if (!Index2)\r
-          {\r
-            TmpIp = (EFI_IP_ADDRESS *) &AllSystemsGroup;\r
-            --Index;\r
-          } else {\r
-            TmpIp = (EFI_IP_ADDRESS *) &Filter->IpList[Index];\r
-          }\r
-          //\r
-          // get MAC address of IP\r
-          //\r
-          StatCode = (*SnpPtr->MCastIpToMac) (SnpPtr, PxebcMode->UsingIpv6, TmpIp, &MACadds[Index2++]);\r
-\r
-          if (EFI_ERROR (StatCode)) {\r
-            DEBUG (\r
-              (DEBUG_INFO,\r
-              "\nIpFilter()  Exit #2  %Xh (%r)",\r
-              StatCode,\r
-              StatCode)\r
-              );\r
-            return StatCode;\r
-          }\r
-        } else {\r
-          Enable |= EFI_SIMPLE_NETWORK_RECEIVE_UNICAST;\r
-        }\r
-      }\r
-    }\r
-\r
-    if (Filter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) {\r
-      Enable |= EFI_SIMPLE_NETWORK_RECEIVE_UNICAST;\r
-    }\r
-  }\r
-  //\r
-  // if nothing changed, just return\r
-  //\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nsnp->ReceiveFilterSetting == %Xh  Filter->IpCnt == %Xh",\r
-    SnpModePtr->ReceiveFilterSetting,\r
-    Filter->IpCnt)\r
-    );\r
-\r
-  if (SnpModePtr->ReceiveFilterSetting == Enable && !Filter->IpCnt) {\r
-    DEBUG ((DEBUG_INFO, "\nIpFilter()  Exit #4"));\r
-    return EFI_SUCCESS;\r
-  }\r
-  //\r
-  // disable those currently set but not set in new filter\r
-  //\r
-  Disable                   = SnpModePtr->ReceiveFilterSetting &~Enable;\r
-\r
-  StatCode                  = SnpPtr->ReceiveFilters (SnpPtr, Enable, Disable, FALSE, Index2, MACadds);\r
-\r
-  PxebcMode->IpFilter.IpCnt = Filter->IpCnt;\r
-\r
-  //\r
-  // join groups for all multicast in list\r
-  //\r
-  for (Index = 0; Index < Filter->IpCnt; ++Index) {\r
-    if (IS_MULTICAST (&Filter->IpList[Index])) {\r
-      IgmpJoinGroup (Private, &Filter->IpList[Index]);\r
-    }\r
-  }\r
-\r
-  DEBUG ((DEBUG_INFO, "\nIpFilter()  Exit #5  %Xh (%r)", StatCode, StatCode));\r
-\r
-  return StatCode;\r
-}\r
-\r
-\r
-/**\r
-  Call the IP filter\r
-\r
-  @param  Private              Pointer to Pxe BaseCode Protocol\r
-  @param  Filter               Pointer to the filter\r
-\r
-  @retval 0                    Successfully set the filter\r
-  @retval !0                   Failed\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcIpFilter (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL  *This,\r
-  IN EFI_PXE_BASE_CODE_IP_FILTER *Filter\r
-  )\r
-{\r
-  EFI_STATUS          StatCode;\r
-  PXE_BASECODE_DEVICE *Private;\r
-  UINTN               Index;\r
-  //\r
-  // Lock the instance data and make sure started\r
-  //\r
-  StatCode = EFI_SUCCESS;\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE poiner == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  for (Index = 0; Index < Filter->IpCnt; ++Index) {\r
-    if ((Filter->IpList[Index].Addr[0]) == BROADCAST_IPv4) {\r
-      //\r
-      // The  IP is a broadcast address.\r
-      //\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  if (This->Mode == NULL || !This->Mode->Started) {\r
-    DEBUG ((DEBUG_ERROR, "BC was not started."));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  if (Filter == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Issue BC command\r
-  //\r
-  StatCode = IpFilter (Private, Filter);\r
-\r
-  //\r
-  // Unlock the instance data\r
-  //\r
-  EfiReleaseLock (&Private->Lock);\r
-  return StatCode;\r
-}\r
-\r
-\r
-/**\r
-  Set the Base Code behavior parameters\r
-\r
-  @param  This                 Pointer to Pxe BaseCode Protocol\r
-  @param  AutoArpPtr           Boolean to do ARP stuff\r
-  @param  SendGuidPtr          Boolean whether or not to send GUID info\r
-  @param  TimeToLivePtr        Value for Total time to live\r
-  @param  TypeOfServicePtr     Value for Type of Service\r
-  @param  MakeCallbackPtr      Boolean to determine if we make callbacks\r
-\r
-  @retval 0                    Successfully set the parameters\r
-  @retval !0                   Failed\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcSetParameters (\r
-  EFI_PXE_BASE_CODE_PROTOCOL  *This,\r
-  BOOLEAN                     *AutoArpPtr,\r
-  BOOLEAN                     *SendGuidPtr,\r
-  UINT8                       *TimeToLivePtr,\r
-  UINT8                       *TypeOfServicePtr,\r
-  BOOLEAN                     *MakeCallbackPtr\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxebcMode;\r
-  EFI_GUID                TmpGuid;\r
-  UINT8                   *SerialNumberPtr;\r
-  EFI_STATUS              StatCode;\r
-  PXE_BASECODE_DEVICE     *Private;\r
-\r
-  //\r
-  // Lock the instance data and make sure started\r
-  //\r
-  StatCode = EFI_SUCCESS;\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE poiner == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  if (This->Mode == NULL || !This->Mode->Started) {\r
-    DEBUG ((DEBUG_ERROR, "BC was not started."));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  DEBUG ((DEBUG_INFO, "\nSetParameters()  Entry.  "));\r
-\r
-  PxebcMode = Private->EfiBc.Mode;\r
-  StatCode  = EFI_SUCCESS;\r
-\r
-  if (SendGuidPtr != NULL) {\r
-    if (*SendGuidPtr) {\r
-      if (PxeBcLibGetSmbiosSystemGuidAndSerialNumber (&TmpGuid, (CHAR8 **) &SerialNumberPtr) != EFI_SUCCESS) {\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    }\r
-  }\r
-\r
-  if (MakeCallbackPtr != NULL) {\r
-    if (*MakeCallbackPtr) {\r
-      if (!SetMakeCallback (Private)) {\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    }\r
-\r
-    PxebcMode->MakeCallbacks = *MakeCallbackPtr;\r
-  }\r
-\r
-  if (AutoArpPtr != NULL) {\r
-    PxebcMode->AutoArp = *AutoArpPtr;\r
-  }\r
-\r
-  if (SendGuidPtr != NULL) {\r
-    PxebcMode->SendGUID = *SendGuidPtr;\r
-  }\r
-\r
-  if (TimeToLivePtr != NULL) {\r
-    PxebcMode->TTL = *TimeToLivePtr;\r
-  }\r
-\r
-  if (TypeOfServicePtr != NULL) {\r
-    PxebcMode->ToS = *TypeOfServicePtr;\r
-  }\r
-  //\r
-  // Unlock the instance data\r
-  //\r
-  DEBUG ((DEBUG_INFO, "\nSetparameters()  Exit = %xh  ", StatCode));\r
-\r
-  EfiReleaseLock (&Private->Lock);\r
-  return StatCode;\r
-}\r
-//\r
-// //////////////////////////////////////////////////////////\r
-//\r
-//  BC Set Station IP Routine\r
-//\r
-\r
-/**\r
-  Set the station IP address\r
-\r
-  @param  This                 Pointer to Pxe BaseCode Protocol\r
-  @param  StationIpPtr         Pointer to the requested IP address to set in base\r
-                               code\r
-  @param  SubnetMaskPtr        Pointer to the requested subnet mask for the base\r
-                               code\r
-\r
-  @retval EFI_SUCCESS          Successfully set the parameters\r
-  @retval EFI_NOT_STARTED      BC has not started\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcSetStationIP (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL *This,\r
-  IN EFI_IP_ADDRESS             *StationIpPtr,\r
-  IN EFI_IP_ADDRESS             *SubnetMaskPtr\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxebcMode;\r
-  EFI_STATUS              StatCode;\r
-  PXE_BASECODE_DEVICE     *Private;\r
-  UINT32                  SubnetMask;\r
-\r
-  //\r
-  // Lock the instance data and make sure started\r
-  //\r
-  StatCode = EFI_SUCCESS;\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE poiner == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  if (This->Mode == NULL || !This->Mode->Started) {\r
-    DEBUG ((DEBUG_ERROR, "BC was not started."));\r
-    StatCode = EFI_NOT_STARTED;\r
-    goto RELEASE_LOCK;\r
-  }\r
-\r
-  PxebcMode = Private->EfiBc.Mode;\r
-\r
-  if (!Private->GoodStationIp && ((StationIpPtr == NULL) || (SubnetMaskPtr == NULL))) {\r
-    //\r
-    // It's not allowed to only set one of the two addresses while there isn't a previous\r
-    // GOOD address configuration.\r
-    //\r
-    StatCode = EFI_INVALID_PARAMETER;\r
-    goto RELEASE_LOCK;\r
-  }\r
-\r
-  if (SubnetMaskPtr != NULL) {\r
-    SubnetMask = SubnetMaskPtr->Addr[0];\r
-\r
-    if (SubnetMask & (SubnetMask + 1)) {\r
-      //\r
-      // the subnet mask is valid if it's with leading continuous 1 bits.\r
-      //\r
-      StatCode = EFI_INVALID_PARAMETER;\r
-      goto RELEASE_LOCK;\r
-    }\r
-  } else {\r
-    SubnetMaskPtr = &PxebcMode->SubnetMask;\r
-    SubnetMask    = SubnetMaskPtr->Addr[0];\r
-  }\r
-\r
-  if (StationIpPtr == NULL) {\r
-    StationIpPtr = &PxebcMode->StationIp;\r
-  }\r
-\r
-  if (!IS_INADDR_UNICAST (StationIpPtr) ||\r
-      ((StationIpPtr->Addr[0] | SubnetMask) == BROADCAST_IPv4)) {\r
-    //\r
-    // The station IP is not a unicast address.\r
-    //\r
-    StatCode = EFI_INVALID_PARAMETER;\r
-    goto RELEASE_LOCK;\r
-  }\r
-\r
-  CopyMem (&PxebcMode->StationIp, StationIpPtr, sizeof (EFI_IP_ADDRESS));\r
-  CopyMem (&PxebcMode->SubnetMask, SubnetMaskPtr, sizeof (EFI_IP_ADDRESS));\r
-  Private->GoodStationIp = TRUE;\r
-\r
-RELEASE_LOCK:\r
-  //\r
-  // Unlock the instance data\r
-  //\r
-  EfiReleaseLock (&Private->Lock);\r
-\r
-  return StatCode;\r
-}\r
-\r
-EFI_DRIVER_BINDING_PROTOCOL mPxeBcDriverBinding = {\r
-  PxeBcDriverSupported,\r
-  PxeBcDriverStart,\r
-  PxeBcDriverStop,\r
-  0xa,\r
-  NULL,\r
-  NULL\r
-};\r
-\r
-\r
-/**\r
-  Test to see if this driver supports Controller. Any Controller\r
-  than contains a Snp protocol can be supported.\r
-\r
-  @param  This                 Protocol instance pointer.\r
-  @param  Controller           Handle of device to test.\r
-  @param  RemainingDevicePath  Not used.\r
-\r
-  @retval EFI_SUCCESS          This driver supports this device.\r
-  @retval EFI_ALREADY_STARTED  This driver is already running on this device.\r
-  @retval other                This driver does not support this device.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcDriverSupported (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  EFI_SIMPLE_NETWORK_PROTOCOL *SnpPtr;\r
-\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  NULL,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiSimpleNetworkProtocolGuid,\r
-                  (VOID **) &SnpPtr,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  gBS->CloseProtocol (\r
-        Controller,\r
-        &gEfiSimpleNetworkProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        Controller\r
-        );\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Start the Base code driver.\r
-\r
-  @param  This                 Protocol instance pointer.\r
-  @param  Controller           Handle of device to test.\r
-  @param  RemainingDevicePath  Not used.\r
-\r
-  @retval EFI_SUCCESS          This driver supports this device.\r
-  @retval EFI_ALREADY_STARTED  This driver is already running on this device.\r
-  @retval other                This driver does not support this device.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcDriverStart (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  )\r
-{\r
-  EFI_STATUS          Status;\r
-  PXE_BASECODE_DEVICE *Private;\r
-  LOADFILE_DEVICE     *pLF;\r
-\r
-  //\r
-  // Allocate structures needed by BaseCode and LoadFile protocols.\r
-  //\r
-  Private = AllocateZeroPool (sizeof (PXE_BASECODE_DEVICE));\r
-\r
-  if (Private == NULL ) {\r
-    DEBUG ((EFI_D_NET, "\nBcNotifySnp()  Could not alloc PXE_BASECODE_DEVICE structure.\n"));\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  pLF = AllocateZeroPool (sizeof (LOADFILE_DEVICE));\r
-  if (pLF == NULL) {\r
-    DEBUG ((EFI_D_NET, "\nBcNotifySnp()  Could not alloc LOADFILE_DEVICE structure.\n"));\r
-    FreePool (Private);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  Private->EfiBc.Mode = AllocateZeroPool (sizeof (EFI_PXE_BASE_CODE_MODE));\r
-  if (Private->EfiBc.Mode == NULL) {\r
-    DEBUG ((EFI_D_NET, "\nBcNotifySnp()  Could not alloc Mode structure.\n"));\r
-    FreePool (Private);\r
-    FreePool (pLF);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  //\r
-  // Lock access, just in case\r
-  //\r
-  EfiInitializeLock (&Private->Lock, TPL_CALLBACK);\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  EfiInitializeLock (&pLF->Lock, TPL_CALLBACK);\r
-  EfiAcquireLock (&pLF->Lock);\r
-\r
-  //\r
-  // Initialize PXE structure\r
-  //\r
-  //\r
-  // First initialize the internal 'private' data that the application\r
-  // does not see.\r
-  //\r
-  Private->Signature  = PXE_BASECODE_DEVICE_SIGNATURE;\r
-  Private->Handle     = Controller;\r
-\r
-  //\r
-  // Get the NII interface\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiNetworkInterfaceIdentifierProtocolGuid_31,\r
-                  (VOID **) &Private->NiiPtr,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto PxeBcError;\r
-  }\r
-\r
-  //\r
-  // Get the Snp interface\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiSimpleNetworkProtocolGuid,\r
-                  (VOID **) &Private->SimpleNetwork,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto PxeBcError;\r
-  }\r
-\r
-  //\r
-  // Next, initialize the external 'public' data that\r
-  // the application does see.\r
-  //\r
-  Private->EfiBc.Revision       = EFI_PXE_BASE_CODE_PROTOCOL_REVISION;\r
-  Private->EfiBc.Start          = BcStart;\r
-  Private->EfiBc.Stop           = BcStop;\r
-  Private->EfiBc.Dhcp           = BcDhcp;\r
-  Private->EfiBc.Discover       = BcDiscover;\r
-  Private->EfiBc.Mtftp          = BcMtftp;\r
-  Private->EfiBc.UdpWrite       = BcUdpWrite;\r
-  Private->EfiBc.UdpRead        = BcUdpRead;\r
-  Private->EfiBc.Arp            = BcArp;\r
-  Private->EfiBc.SetIpFilter    = BcIpFilter;\r
-  Private->EfiBc.SetParameters  = BcSetParameters;\r
-  Private->EfiBc.SetStationIp   = BcSetStationIP;\r
-  Private->EfiBc.SetPackets     = BcSetPackets;\r
-\r
-  //\r
-  // Initialize BaseCode Mode structure\r
-  //\r
-  Private->EfiBc.Mode->Started    = FALSE;\r
-  Private->EfiBc.Mode->TTL        = DEFAULT_TTL;\r
-  Private->EfiBc.Mode->ToS        = DEFAULT_ToS;\r
-  Private->EfiBc.Mode->UsingIpv6  = FALSE;\r
-  Private->EfiBc.Mode->AutoArp    = TRUE;\r
-\r
-  //\r
-  // Set to PXE_TRUE by the BC constructor if this BC\r
-  // implementation supports IPv6.\r
-  //\r
-  Private->EfiBc.Mode->Ipv6Supported = SUPPORT_IPV6;\r
-  Private->EfiBc.Mode->Ipv6Available = FALSE;\r
-\r
-  //\r
-  // Set to TRUE by the BC constructor if this BC\r
-  // implementation supports BIS.\r
-  //\r
-  Private->EfiBc.Mode->BisSupported = TRUE;\r
-  Private->EfiBc.Mode->BisDetected  = PxebcBisDetect (Private);\r
-\r
-  //\r
-  // Initialize LoadFile structure.\r
-  //\r
-  pLF->Signature          = LOADFILE_DEVICE_SIGNATURE;\r
-  pLF->LoadFile.LoadFile  = LoadFile;\r
-  pLF->Private            = Private;\r
-\r
-  //\r
-  // Install protocol interfaces.\r
-  //\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &Controller,\r
-                  &gEfiPxeBaseCodeProtocolGuid,\r
-                  &Private->EfiBc,\r
-                  &gEfiLoadFileProtocolGuid,\r
-                  &pLF->LoadFile,\r
-                  NULL\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiSimpleNetworkProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
-\r
-    goto PxeBcError;\r
-  }\r
-  //\r
-  // Release locks.\r
-  //\r
-  EfiReleaseLock (&pLF->Lock);\r
-  EfiReleaseLock (&Private->Lock);\r
-  return Status;\r
-\r
-PxeBcError: ;\r
-  gBS->FreePool (Private->EfiBc.Mode);\r
-  gBS->FreePool (Private);\r
-  gBS->FreePool (pLF);\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Stop the Base code driver.\r
-\r
-  @param  This                 Protocol instance pointer.\r
-  @param  Controller           Handle of device to test.\r
-  @param  NumberOfChildren     Not used\r
-  @param  ChildHandleBuffer    Not used\r
-\r
-  @retval EFI_SUCCESS          This driver supports this device.\r
-  @retval EFI_ALREADY_STARTED  This driver is already running on this device.\r
-  @retval other                This driver does not support this device.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcDriverStop (\r
-  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN  EFI_HANDLE                     Controller,\r
-  IN  UINTN                          NumberOfChildren,\r
-  IN  EFI_HANDLE                     *ChildHandleBuffer\r
-  )\r
-{\r
-  EFI_STATUS              Status;\r
-  EFI_LOAD_FILE_PROTOCOL  *LfProtocol;\r
-  LOADFILE_DEVICE         *LoadDevice;\r
-\r
-  //\r
-  // Get our context back.\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiLoadFileProtocolGuid,\r
-                  (VOID **) &LfProtocol,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  LoadDevice = EFI_LOAD_FILE_DEV_FROM_THIS (LfProtocol);\r
-\r
-  Status = gBS->UninstallMultipleProtocolInterfaces (\r
-                  Controller,\r
-                  &gEfiLoadFileProtocolGuid,\r
-                  &LoadDevice->LoadFile,\r
-                  &gEfiPxeBaseCodeProtocolGuid,\r
-                  &LoadDevice->Private->EfiBc,\r
-                  NULL\r
-                  );\r
-\r
-  if (!EFI_ERROR (Status)) {\r
-\r
-    Status = gBS->CloseProtocol (\r
-                    Controller,\r
-                    &gEfiSimpleNetworkProtocolGuid,\r
-                    This->DriverBindingHandle,\r
-                    Controller\r
-                    );\r
-\r
-    gBS->FreePool (LoadDevice->Private->EfiBc.Mode);\r
-    gBS->FreePool (LoadDevice->Private);\r
-    gBS->FreePool (LoadDevice);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcUnload (\r
-  IN EFI_HANDLE  ImageHandle\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINTN       DeviceHandleCount;\r
-  EFI_HANDLE  *DeviceHandleBuffer;\r
-  UINTN       Index;\r
-\r
-  Status = gBS->LocateHandleBuffer (\r
-                  AllHandles,\r
-                  NULL,\r
-                  NULL,\r
-                  &DeviceHandleCount,\r
-                  &DeviceHandleBuffer\r
-                  );\r
-  if (!EFI_ERROR (Status)) {\r
-    for (Index = 0; Index < DeviceHandleCount; Index++) {\r
-      Status = gBS->DisconnectController (\r
-                      DeviceHandleBuffer[Index],\r
-                      mPxeBcDriverBinding.DriverBindingHandle,\r
-                      NULL\r
-                      );\r
-    }\r
-\r
-    if (DeviceHandleBuffer != NULL) {\r
-      gBS->FreePool (DeviceHandleBuffer);\r
-    }\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Initialize the base code drivers and install the driver binding\r
-\r
-  Standard EFI Image Entry\r
-\r
-  @retval EFI_SUCCESS          This driver was successfully bound\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-InitializeBCDriver (\r
-  IN EFI_HANDLE       ImageHandle,\r
-  IN EFI_SYSTEM_TABLE *SystemTable\r
-  )\r
-{\r
-  EFI_STATUS                 Status;\r
-  EFI_LOADED_IMAGE_PROTOCOL  *LoadedImage;\r
-\r
-  //\r
-  // Initialize EFI library\r
-  //\r
-  Status = EfiLibInstallDriverBindingComponentName2 (\r
-             ImageHandle,\r
-             SystemTable,\r
-             &mPxeBcDriverBinding,\r
-             NULL,\r
-             &gPxeBcComponentName,\r
-             &gPxeBcComponentName2\r
-             );\r
-\r
-  Status = gBS->HandleProtocol (\r
-                  ImageHandle,\r
-                  &gEfiLoadedImageProtocolGuid,\r
-                  (VOID **) &LoadedImage\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  } else {\r
-    LoadedImage->Unload = PxeBcUnload;\r
-  }\r
-\r
-  InitArpHeader ();\r
-  OptionsStrucInit ();\r
-\r
-  return Status;\r
-}\r
-\r
-/* eof - bc.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Bc.h
deleted file mode 100644 (file)
index 6c97693..0000000
+++ /dev/null
@@ -1,427 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  bc.h\r
-\r
-Abstract:\r
-\r
-\r
-**/\r
-\r
-#ifndef _BC_H\r
-#define _BC_H\r
-\r
-#include <Uefi.h>\r
-\r
-#include <Guid/SmBios.h>\r
-#include <IndustryStandard/SmBios.h>\r
-#include <Protocol/Bis.h>\r
-#include <Protocol/PxeBaseCode.h>\r
-#include <Protocol/PxeBaseCodeCallBack.h>\r
-#include <Protocol/NetworkInterfaceIdentifier.h>\r
-#include <Protocol/SimpleNetwork.h>\r
-#include <Protocol/LoadFile.h>\r
-#include <Protocol/DevicePath.h>\r
-#include <Protocol/Tcp.h>\r
-#include <Protocol/LoadedImage.h>\r
-\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/UefiDriverEntryPoint.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/UefiLib.h>\r
-\r
-#define CALLBACK_INTERVAL             100 // ten times a second\r
-#define FILTER_BITS                   (EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP | \\r
-                     EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST | \\r
-                     EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS | \\r
-                     EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST \\r
-          )\r
-\r
-#define WAIT_TX_TIMEOUT               1000\r
-\r
-#define SUPPORT_IPV6                  0\r
-\r
-#define PXE_BASECODE_DEVICE_SIGNATURE SIGNATURE_32 ('p', 'x', 'e', 'd')\r
-\r
-//\r
-// Determine the classes of IPv4 address\r
-//\r
-#define  IS_CLASSA_IPADDR(x)  ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0x80) == 0x00)\r
-#define  IS_CLASSB_IPADDR(x)  ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xc0) == 0x80)\r
-#define  IS_CLASSC_IPADDR(x)  ((((EFI_IP_ADDRESS*)x)->v4.Addr[0] & 0xe0) == 0xc0)\r
-#define  IS_INADDR_UNICAST(x) ((IS_CLASSA_IPADDR(x) || IS_CLASSB_IPADDR(x) || IS_CLASSC_IPADDR(x)) && (((EFI_IP_ADDRESS*)x)->Addr[0] != 0) )\r
-\r
-//\r
-// Definitions for internet group management protocol version 2 message\r
-// structure\r
-// Per RFC 2236, November 1997\r
-//\r
-#pragma pack(1)\r
-\r
-typedef struct {\r
-  UINT8   Type;\r
-  UINT8   MaxRespTime;  // in tenths of a second\r
-  UINT16  Checksum;     // ones complement of ones complement sum of\r
-                        // 16 bit words of message\r
-  UINT32  GroupAddress; // for general query, all systems group,\r
-                        // for group specific, the group\r
-} IGMPV2_MESSAGE;\r
-\r
-#define IGMP_TYPE_QUERY                 0x11\r
-#define IGMP_TYPE_REPORT                0x16\r
-#define IGMP_TYPE_V1REPORT              0x12\r
-#define IGMP_TYPE_LEAVE_GROUP           0x17\r
-\r
-#define IGMP_DEFAULT_MAX_RESPONSE_TIME  10  // 10 second default\r
-#pragma pack()\r
-\r
-#define MAX_MCAST_GROUPS  8                 // most we allow ourselves to join at once\r
-#define MAX_OFFERS        16\r
-\r
-typedef struct {\r
-  UINTN                                     Signature;\r
-  EFI_LOCK                                  Lock;\r
-  BOOLEAN                                   ShowErrorMessages;\r
-  EFI_TCP_PROTOCOL                          Tcp;\r
-  EFI_PXE_BASE_CODE_PROTOCOL                EfiBc;\r
-  EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL       *CallbackProtocolPtr;\r
-  EFI_HANDLE                                Handle;\r
-\r
-  EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *NiiPtr;\r
-  EFI_SIMPLE_NETWORK_PROTOCOL               *SimpleNetwork;\r
-  UINT8                                     *TransmitBufferPtr;\r
-  UINT8                                     *ReceiveBufferPtr;\r
-  EFI_PXE_BASE_CODE_FUNCTION                Function;\r
-\r
-  UINTN                                     OldestArpEntry;\r
-  UINTN                                     MCastGroupCount;\r
-  EFI_EVENT                                 Igmpv1TimeoutEvent;\r
-  BOOLEAN                                   UseIgmpv1Reporting;\r
-  EFI_EVENT                                 IgmpGroupEvent[MAX_MCAST_GROUPS];\r
-  UINT16                                    RandomPort;\r
-\r
-#if SUPPORT_IPV6\r
-  //\r
-  // TBD\r
-  //\r
-#else\r
-  UINT32          MCastGroup[MAX_MCAST_GROUPS];\r
-#endif\r
-\r
-  BOOLEAN         GoodStationIp;\r
-  BOOLEAN         DidTransmit;\r
-  UINTN           IpLength;\r
-  VOID            *DhcpPacketBuffer;\r
-  UINTN           FileSize;\r
-  VOID            *BootServerReceiveBuffer;\r
-  EFI_IP_ADDRESS  ServerIp;\r
-\r
-  //\r
-  // work area\r
-  // for dhcp\r
-  //\r
-  VOID            *ReceiveBuffers;\r
-  VOID            *TransmitBuffer;\r
-  UINTN           NumOffersReceived;\r
-  UINT16          TotalSeconds;\r
-\r
-  //\r
-  // arrays for different types of offers\r
-  //\r
-  UINT8           ServerCount[4];\r
-  UINT8           OfferCount[4][MAX_OFFERS];\r
-  UINT8           GotBootp;\r
-  UINT8           GotProxy[4];\r
-  UINT8           BinlProxies[MAX_OFFERS];\r
-\r
-  UINT8           *ArpBuffer;\r
-  UINT8           *TftpAckBuffer;\r
-  UINT8           *TftpErrorBuffer;\r
-  IGMPV2_MESSAGE  IgmpMessage;\r
-  BOOLEAN         BigBlkNumFlag;\r
-  UINT8           Timeout;\r
-  UINT16          RandomSeed;\r
-} PXE_BASECODE_DEVICE;\r
-\r
-//\r
-// type index\r
-//\r
-#define DHCP_ONLY_IX      0\r
-#define PXE10_IX          1\r
-#define WfM11a_IX         2\r
-#define BINL_IX           3\r
-\r
-#define PXE_RND_PORT_LOW  2070\r
-\r
-//\r
-//\r
-//\r
-#define LOADFILE_DEVICE_SIGNATURE SIGNATURE_32 ('p', 'x', 'e', 'l')\r
-\r
-typedef struct {\r
-  UINTN                   Signature;\r
-  EFI_LOCK                Lock;\r
-  EFI_LOAD_FILE_PROTOCOL  LoadFile;\r
-  PXE_BASECODE_DEVICE     *Private;\r
-} LOADFILE_DEVICE;\r
-\r
-#define EFI_BASE_CODE_DEV_FROM_THIS(a)  CR (a, PXE_BASECODE_DEVICE, efi_bc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-#define EFI_BASE_CODE_DEV_FROM_TCP(a)   CR (a, PXE_BASECODE_DEVICE, Tcp, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-#define EFI_LOAD_FILE_DEV_FROM_THIS(a)  CR (a, LOADFILE_DEVICE, LoadFile, LOADFILE_DEVICE_SIGNATURE)\r
-\r
-EFI_BIS_PROTOCOL                    *\r
-PxebcBisStart (\r
-  PXE_BASECODE_DEVICE     *Private,\r
-  BIS_APPLICATION_HANDLE  *BisAppHandle,\r
-  EFI_BIS_DATA            **BisDataSigInfo\r
-  );\r
-\r
-VOID\r
-PxebcBisStop (\r
-  EFI_BIS_PROTOCOL        *Bis,\r
-  BIS_APPLICATION_HANDLE  BisAppHandle,\r
-  EFI_BIS_DATA            *BisDataSigInfo\r
-  );\r
-\r
-BOOLEAN\r
-PxebcBisVerify (\r
-  PXE_BASECODE_DEVICE     *Private,\r
-  VOID                    *FileBuffer,\r
-  UINTN                   FileBufferLength,\r
-  VOID                    *CredentialBuffer,\r
-  UINTN                   CredentialBufferLength\r
-  );\r
-\r
-BOOLEAN\r
-PxebcBisDetect (\r
-  PXE_BASECODE_DEVICE *Private\r
-  );\r
-\r
-//\r
-// Global Variables\r
-//\r
-extern EFI_COMPONENT_NAME_PROTOCOL   gPxeBcComponentName;\r
-extern EFI_COMPONENT_NAME2_PROTOCOL  gPxeBcComponentName2;\r
-\r
-//\r
-// //////////////////////////////////////////////////////////\r
-//\r
-// prototypes\r
-//\r
-\r
-/**\r
-  Initialize the base code drivers and install the driver binding\r
-\r
-  Standard EFI Image Entry\r
-\r
-  @retval EFI_SUCCESS  This driver was successfully bound\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-InitializeBCDriver (\r
-  IN EFI_HANDLE                       ImageHandle,\r
-  IN EFI_SYSTEM_TABLE                 *SystemTable\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcStart (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
-  IN BOOLEAN                          UseIpv6\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcStop (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcDhcp (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
-  IN BOOLEAN                          SortOffers\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcDiscover (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
-  IN UINT16                           Type,\r
-  IN UINT16                           *Layer,\r
-  IN BOOLEAN                          UseBis,\r
-  IN EFI_PXE_BASE_CODE_DISCOVER_INFO  * Info OPTIONAL\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcMtftp (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
-  IN EFI_PXE_BASE_CODE_TFTP_OPCODE    Operation,\r
-  IN OUT VOID                         *BufferPtr,\r
-  IN BOOLEAN                          Overwrite,\r
-  IN OUT UINT64                       *BufferSize,\r
-  IN UINTN                            *BlockSize OPTIONAL,\r
-  IN EFI_IP_ADDRESS                   * ServerIp,\r
-  IN UINT8                            *Filename,\r
-  IN EFI_PXE_BASE_CODE_MTFTP_INFO     * Info OPTIONAL,\r
-  IN BOOLEAN                          DontUseBuffer\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcUdpWrite (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
-  IN UINT16                           OpFlags,\r
-  IN EFI_IP_ADDRESS                   *DestIp,\r
-  IN EFI_PXE_BASE_CODE_UDP_PORT       *DestPort,\r
-  IN EFI_IP_ADDRESS                   *GatewayIp, OPTIONAL\r
-  IN EFI_IP_ADDRESS                   *SrcIp, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *SrcPort, OPTIONAL\r
-  IN UINTN                            *HeaderSize, OPTIONAL\r
-  IN VOID                             *HeaderPtr, OPTIONAL\r
-  IN UINTN                            *BufferSize,\r
-  IN VOID                             *BufferPtr\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcUdpRead (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
-  IN UINT16                           OpFlags,\r
-  IN OUT EFI_IP_ADDRESS               *DestIp, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *DestPort, OPTIONAL\r
-  IN OUT EFI_IP_ADDRESS               *SrcIp, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *SrcPort, OPTIONAL\r
-  IN UINTN                            *HeaderSize, OPTIONAL\r
-  IN VOID                             *HeaderPtr, OPTIONAL\r
-  IN OUT UINTN                        *BufferSize,\r
-  IN VOID                             *BufferPtr\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcTcpWrite (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
-  IN UINT16                           OpFlags,\r
-  IN UINT16                           *UrgentPointer,\r
-  IN UINT32                           *SequenceNumber,\r
-  IN UINT32                           *AckNumber,\r
-  IN UINT16                           *HlenResCode,\r
-  IN UINT16                           *Window,\r
-  IN EFI_IP_ADDRESS                   *DestIp,\r
-  IN EFI_PXE_BASE_CODE_TCP_PORT       *DestPort,\r
-  IN EFI_IP_ADDRESS                   *GatewayIp, OPTIONAL\r
-  IN EFI_IP_ADDRESS                   *SrcIp, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_TCP_PORT   *SrcPort, OPTIONAL\r
-  IN UINTN                            *HeaderSize, OPTIONAL\r
-  IN VOID                             *HeaderPtr, OPTIONAL\r
-  IN UINTN                            *BufferSize,\r
-  IN VOID                             *BufferPtr\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcTcpRead (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
-  IN UINT16                           OpFlags,\r
-  IN OUT EFI_IP_ADDRESS               *DestIp, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_TCP_PORT   *DestPort, OPTIONAL\r
-  IN OUT EFI_IP_ADDRESS               *SrcIp, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_TCP_PORT   *SrcPort, OPTIONAL\r
-  IN UINTN                            *HeaderSize, OPTIONAL\r
-  IN VOID                             *HeaderPtr, OPTIONAL\r
-  IN OUT UINTN                        *BufferSize,\r
-  IN VOID                             *BufferPtr\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcArp (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
-  IN EFI_IP_ADDRESS                   * IpAddr,\r
-  IN EFI_MAC_ADDRESS                  * MacAddr OPTIONAL\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcIpFilter (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       *This,\r
-  IN EFI_PXE_BASE_CODE_IP_FILTER      *NewFilter\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcSetParameters (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
-  IN BOOLEAN                          *NewAutoArp, OPTIONAL\r
-  IN BOOLEAN                          *NewSendGUID, OPTIONAL\r
-  IN UINT8                            *NewTTL, OPTIONAL\r
-  IN UINT8                            *NewToS, OPTIONAL\r
-  IN BOOLEAN                          *NewMakeCallback OPTIONAL\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcSetStationIP (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
-  IN EFI_IP_ADDRESS                   * NewStationIp, OPTIONAL\r
-  IN EFI_IP_ADDRESS                   * NewSubnetMask OPTIONAL\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-BcSetPackets (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
-  BOOLEAN                             *NewDhcpDiscoverValid, OPTIONAL\r
-  BOOLEAN                             *NewDhcpAckReceived, OPTIONAL\r
-  BOOLEAN                             *NewProxyOfferReceived, OPTIONAL\r
-  BOOLEAN                             *NewPxeDiscoverValid, OPTIONAL\r
-  BOOLEAN                             *NewPxeReplyReceived, OPTIONAL\r
-  BOOLEAN                             *NewPxeBisReplyReceived, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET         * NewDhcpDiscover, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET         * NewDhcpAck, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET         * NewProxyOffer, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET         * NewPxeDiscover, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET         * NewPxeReply, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET         * NewPxeBisReply OPTIONAL\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-LoadFile (\r
-  IN EFI_LOAD_FILE_PROTOCOL           *This,\r
-  IN EFI_DEVICE_PATH_PROTOCOL         *FilePath,\r
-  IN BOOLEAN                          BootPolicy,\r
-  IN OUT UINTN                        *BufferSize,\r
-  IN VOID                             *Buffer\r
-  );\r
-\r
-EFI_STATUS\r
-PxeBcLibGetSmbiosSystemGuidAndSerialNumber (\r
-  IN  EFI_GUID    *SystemGuid,\r
-  OUT CHAR8       **SystemSerialNumber\r
-  );\r
-\r
-#include "Ip.h"\r
-#include "Dhcp.h"\r
-#include "Tftp.h"\r
-\r
-#endif /* _BC_H */\r
-\r
-/* EOF - bc.h */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/ComponentName.c b/MdeModulePkg/Universal/Network/PxeBcDxe/ComponentName.c
deleted file mode 100644 (file)
index 9a09828..0000000
+++ /dev/null
@@ -1,317 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  ComponentName.c\r
-\r
-Abstract:\r
-\r
-\r
-**/\r
-\r
-#include "Bc.h"\r
-\r
-//\r
-// EFI Component Name Functions\r
-//\r
-/**\r
-  Retrieves a Unicode string that is the user readable name of the driver.\r
-\r
-  This function retrieves the user readable name of a driver in the form of a\r
-  Unicode string. If the driver specified by This has a user readable name in\r
-  the language specified by Language, then a pointer to the driver name is\r
-  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified\r
-  by This does not support the language specified by Language,\r
-  then EFI_UNSUPPORTED is returned.\r
-\r
-  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
-                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
-\r
-  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
-                                array indicating the language. This is the\r
-                                language of the driver name that the caller is\r
-                                requesting, and it must match one of the\r
-                                languages specified in SupportedLanguages. The\r
-                                number of languages supported by a driver is up\r
-                                to the driver writer. Language is specified\r
-                                in RFC 3066 or ISO 639-2 language code format.\r
-\r
-  @param  DriverName[out]       A pointer to the Unicode string to return.\r
-                                This Unicode string is the name of the\r
-                                driver specified by This in the language\r
-                                specified by Language.\r
-\r
-  @retval EFI_SUCCESS           The Unicode string for the Driver specified by\r
-                                This and the language specified by Language was\r
-                                returned in DriverName.\r
-\r
-  @retval EFI_INVALID_PARAMETER Language is NULL.\r
-\r
-  @retval EFI_INVALID_PARAMETER DriverName is NULL.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
-                                the language specified by Language.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcComponentNameGetDriverName (\r
-  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,\r
-  IN  CHAR8                        *Language,\r
-  OUT CHAR16                       **DriverName\r
-  );\r
-\r
-\r
-/**\r
-  Retrieves a Unicode string that is the user readable name of the controller\r
-  that is being managed by a driver.\r
-\r
-  This function retrieves the user readable name of the controller specified by\r
-  ControllerHandle and ChildHandle in the form of a Unicode string. If the\r
-  driver specified by This has a user readable name in the language specified by\r
-  Language, then a pointer to the controller name is returned in ControllerName,\r
-  and EFI_SUCCESS is returned.  If the driver specified by This is not currently\r
-  managing the controller specified by ControllerHandle and ChildHandle,\r
-  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not\r
-  support the language specified by Language, then EFI_UNSUPPORTED is returned.\r
-\r
-  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
-                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
-\r
-  @param  ControllerHandle[in]  The handle of a controller that the driver\r
-                                specified by This is managing.  This handle\r
-                                specifies the controller whose name is to be\r
-                                returned.\r
-\r
-  @param  ChildHandle[in]       The handle of the child controller to retrieve\r
-                                the name of.  This is an optional parameter that\r
-                                may be NULL.  It will be NULL for device\r
-                                drivers.  It will also be NULL for a bus drivers\r
-                                that wish to retrieve the name of the bus\r
-                                controller.  It will not be NULL for a bus\r
-                                driver that wishes to retrieve the name of a\r
-                                child controller.\r
-\r
-  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
-                                array indicating the language.  This is the\r
-                                language of the driver name that the caller is\r
-                                requesting, and it must match one of the\r
-                                languages specified in SupportedLanguages. The\r
-                                number of languages supported by a driver is up\r
-                                to the driver writer. Language is specified in\r
-                                RFC 3066 or ISO 639-2 language code format.\r
-\r
-  @param  ControllerName[out]   A pointer to the Unicode string to return.\r
-                                This Unicode string is the name of the\r
-                                controller specified by ControllerHandle and\r
-                                ChildHandle in the language specified by\r
-                                Language from the point of view of the driver\r
-                                specified by This.\r
-\r
-  @retval EFI_SUCCESS           The Unicode string for the user readable name in\r
-                                the language specified by Language for the\r
-                                driver specified by This was returned in\r
-                                DriverName.\r
-\r
-  @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
-\r
-  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
-                                EFI_HANDLE.\r
-\r
-  @retval EFI_INVALID_PARAMETER Language is NULL.\r
-\r
-  @retval EFI_INVALID_PARAMETER ControllerName is NULL.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This is not currently\r
-                                managing the controller specified by\r
-                                ControllerHandle and ChildHandle.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
-                                the language specified by Language.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcComponentNameGetControllerName (\r
-  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,\r
-  IN  EFI_HANDLE                                      ControllerHandle,\r
-  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,\r
-  IN  CHAR8                                           *Language,\r
-  OUT CHAR16                                          **ControllerName\r
-  );\r
-\r
-\r
-//\r
-// EFI Component Name Protocol\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL  gPxeBcComponentName = {\r
-  PxeBcComponentNameGetDriverName,\r
-  PxeBcComponentNameGetControllerName,\r
-  "eng"\r
-};\r
-\r
-//\r
-// EFI Component Name 2 Protocol\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2 = {\r
-  (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) PxeBcComponentNameGetDriverName,\r
-  (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) PxeBcComponentNameGetControllerName,\r
-  "en"\r
-};\r
-\r
-\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPxeBcDriverNameTable[] = {\r
-  {\r
-    "eng;en",\r
-    L"PXE Base Code Driver"\r
-  },\r
-  {\r
-    NULL,\r
-    NULL\r
-  }\r
-};\r
-\r
-/**\r
-  Retrieves a Unicode string that is the user readable name of the driver.\r
-\r
-  This function retrieves the user readable name of a driver in the form of a\r
-  Unicode string. If the driver specified by This has a user readable name in\r
-  the language specified by Language, then a pointer to the driver name is\r
-  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified\r
-  by This does not support the language specified by Language,\r
-  then EFI_UNSUPPORTED is returned.\r
-\r
-  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
-                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
-\r
-  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
-                                array indicating the language. This is the\r
-                                language of the driver name that the caller is\r
-                                requesting, and it must match one of the\r
-                                languages specified in SupportedLanguages. The\r
-                                number of languages supported by a driver is up\r
-                                to the driver writer. Language is specified\r
-                                in RFC 3066 or ISO 639-2 language code format.\r
-\r
-  @param  DriverName[out]       A pointer to the Unicode string to return.\r
-                                This Unicode string is the name of the\r
-                                driver specified by This in the language\r
-                                specified by Language.\r
-\r
-  @retval EFI_SUCCESS           The Unicode string for the Driver specified by\r
-                                This and the language specified by Language was\r
-                                returned in DriverName.\r
-\r
-  @retval EFI_INVALID_PARAMETER Language is NULL.\r
-\r
-  @retval EFI_INVALID_PARAMETER DriverName is NULL.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
-                                the language specified by Language.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcComponentNameGetDriverName (\r
-  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,\r
-  IN  CHAR8                        *Language,\r
-  OUT CHAR16                       **DriverName\r
-  )\r
-{\r
-  return LookupUnicodeString2 (\r
-           Language,\r
-           This->SupportedLanguages,\r
-           mPxeBcDriverNameTable,\r
-           DriverName,\r
-           (BOOLEAN)(This == &gPxeBcComponentName)\r
-           );\r
-}\r
-\r
-/**\r
-  Retrieves a Unicode string that is the user readable name of the controller\r
-  that is being managed by a driver.\r
-\r
-  This function retrieves the user readable name of the controller specified by\r
-  ControllerHandle and ChildHandle in the form of a Unicode string. If the\r
-  driver specified by This has a user readable name in the language specified by\r
-  Language, then a pointer to the controller name is returned in ControllerName,\r
-  and EFI_SUCCESS is returned.  If the driver specified by This is not currently\r
-  managing the controller specified by ControllerHandle and ChildHandle,\r
-  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not\r
-  support the language specified by Language, then EFI_UNSUPPORTED is returned.\r
-\r
-  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
-                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
-\r
-  @param  ControllerHandle[in]  The handle of a controller that the driver\r
-                                specified by This is managing.  This handle\r
-                                specifies the controller whose name is to be\r
-                                returned.\r
-\r
-  @param  ChildHandle[in]       The handle of the child controller to retrieve\r
-                                the name of.  This is an optional parameter that\r
-                                may be NULL.  It will be NULL for device\r
-                                drivers.  It will also be NULL for a bus drivers\r
-                                that wish to retrieve the name of the bus\r
-                                controller.  It will not be NULL for a bus\r
-                                driver that wishes to retrieve the name of a\r
-                                child controller.\r
-\r
-  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
-                                array indicating the language.  This is the\r
-                                language of the driver name that the caller is\r
-                                requesting, and it must match one of the\r
-                                languages specified in SupportedLanguages. The\r
-                                number of languages supported by a driver is up\r
-                                to the driver writer. Language is specified in\r
-                                RFC 3066 or ISO 639-2 language code format.\r
-\r
-  @param  ControllerName[out]   A pointer to the Unicode string to return.\r
-                                This Unicode string is the name of the\r
-                                controller specified by ControllerHandle and\r
-                                ChildHandle in the language specified by\r
-                                Language from the point of view of the driver\r
-                                specified by This.\r
-\r
-  @retval EFI_SUCCESS           The Unicode string for the user readable name in\r
-                                the language specified by Language for the\r
-                                driver specified by This was returned in\r
-                                DriverName.\r
-\r
-  @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
-\r
-  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
-                                EFI_HANDLE.\r
-\r
-  @retval EFI_INVALID_PARAMETER Language is NULL.\r
-\r
-  @retval EFI_INVALID_PARAMETER ControllerName is NULL.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This is not currently\r
-                                managing the controller specified by\r
-                                ControllerHandle and ChildHandle.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
-                                the language specified by Language.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcComponentNameGetControllerName (\r
-  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,\r
-  IN  EFI_HANDLE                                      ControllerHandle,\r
-  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,\r
-  IN  CHAR8                                           *Language,\r
-  OUT CHAR16                                          **ControllerName\r
-  )\r
-{\r
-  return EFI_UNSUPPORTED;\r
-}\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Dhcp.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Dhcp.h
deleted file mode 100644 (file)
index 839a093..0000000
+++ /dev/null
@@ -1,632 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-\r
-**/\r
-\r
-#ifndef _DHCP_H\r
-#define _DHCP_H\r
-\r
-//\r
-// Definitions for DHCP version 4 UDP packet.\r
-// The field names in this structure are defined and described in RFC 2131.\r
-//\r
-#pragma pack(1)\r
-\r
-typedef struct {\r
-  UINT8   op;\r
-#define BOOTP_REQUEST 1\r
-#define BOOTP_REPLY   2\r
-\r
-  UINT8   htype;\r
-  UINT8   hlen;\r
-  UINT8   hops;\r
-  UINT32  xid;\r
-  UINT16  secs;\r
-  UINT16  flags;\r
-#define DHCP_BROADCAST_FLAG 0x8000\r
-\r
-  UINT32  ciaddr;\r
-  UINT32  yiaddr;\r
-  UINT32  siaddr;\r
-  UINT32  giaddr;\r
-  UINT8   chaddr[16];\r
-  UINT8   sname[64];\r
-  UINT8   file[128];\r
-  UINT8   options[312];\r
-#define OP_PAD                              0\r
-#define OP_END                              255\r
-#define OP_SUBNET_MASK                      1\r
-#define OP_TIME_OFFSET                      2\r
-#define OP_ROUTER_LIST                      3\r
-#define OP_TIME_SERVERS                     4\r
-#define OP_NAME_SERVERS                     5\r
-#define OP_DNS_SERVERS                      6\r
-#define OP_LOG_SERVERS                      7\r
-#define OP_COOKIE_SERVERS                   8\r
-#define OP_LPR_SREVERS                      9\r
-#define OP_IMPRESS_SERVERS                  10\r
-#define OP_RES_LOC_SERVERS                  11\r
-#define OP_HOST_NAME                        12\r
-#define OP_BOOT_FILE_SZ                     13\r
-#define OP_DUMP_FILE                        14\r
-#define OP_DOMAIN_NAME                      15\r
-#define OP_SWAP_SERVER                      16\r
-#define OP_ROOT_PATH                        17\r
-#define OP_EXTENSION_PATH                   18\r
-#define OP_IP_FORWARDING                    19\r
-#define OP_NON_LOCAL_SRC_RTE                20\r
-#define OP_POLICY_FILTER                    21\r
-#define OP_MAX_DATAGRAM_SZ                  22\r
-#define OP_DEFAULT_TTL                      23\r
-#define OP_MTU_AGING_TIMEOUT                24\r
-#define OP_MTU_SIZES                        25\r
-#define OP_MTU_TO_USE                       26\r
-#define OP_ALL_SUBNETS_LOCAL                27\r
-#define OP_BROADCAST_ADD                    28\r
-#define OP_PERFORM_MASK_DISCOVERY           29\r
-#define OP_RESPOND_TO_MASK_REQ              30\r
-#define OP_PERFORM_ROUTER_DISCOVERY         31\r
-#define OP_ROUTER_SOLICIT_ADDRESS           32\r
-#define OP_STATIC_ROUTER_LIST               33\r
-#define OP_USE_ARP_TRAILERS                 34\r
-#define OP_ARP_CACHE_TIMEOUT                35\r
-#define OP_ETHERNET_ENCAPSULATION           36\r
-#define OP_TCP_DEFAULT_TTL                  37\r
-#define OP_TCP_KEEP_ALIVE_INT               38\r
-#define OP_KEEP_ALIVE_GARBAGE               39\r
-#define OP_NIS_DOMAIN_NAME                  40\r
-#define OP_NIS_SERVERS                      41\r
-#define OP_NTP_SERVERS                      42\r
-#define OP_VENDOR_SPECIFIC                  43\r
-#define VEND_PXE_MTFTP_IP                   1\r
-#define VEND_PXE_MTFTP_CPORT                2\r
-#define VEND_PXE_MTFTP_SPORT                3\r
-#define VEND_PXE_MTFTP_TMOUT                4\r
-#define VEND_PXE_MTFTP_DELAY                5\r
-#define VEND_PXE_DISCOVERY_CONTROL          6\r
-#define PXE_DISABLE_BROADCAST_DISCOVERY     (1 << 0)\r
-#define PXE_DISABLE_MULTICAST_DISCOVERY     (1 << 1)\r
-#define PXE_ACCEPT_ONLY_PXE_BOOT_SERVERS    (1 << 2)\r
-#define PXE_DO_NOT_PROMPT                   (1 << 3)\r
-#define VEND_PXE_DISCOVERY_MCAST_ADDR       7\r
-#define VEND_PXE_BOOT_SERVERS               8\r
-#define VEND_PXE_BOOT_MENU                  9\r
-#define VEND_PXE_BOOT_PROMPT                10\r
-#define VEND_PXE_MCAST_ADDRS_ALLOC          11\r
-#define VEND_PXE_CREDENTIAL_TYPES           12\r
-#define VEND_PXE_BOOT_ITEM                  71\r
-#define OP_NBNS_SERVERS                     44\r
-#define OP_NBDD_SERVERS                     45\r
-#define OP_NETBIOS_NODE_TYPE                46\r
-#define OP_NETBIOS_SCOPE                    47\r
-#define OP_XWINDOW_SYSTEM_FONT_SERVERS      48\r
-#define OP_XWINDOW_SYSTEM_DISPLAY_MANAGERS  49\r
-#define OP_DHCP_REQ_IP_ADD                  50\r
-#define OP_DHCP_LEASE_TIME                  51\r
-#define OP_DHCP_OPTION_OVERLOAD             52\r
-#define OVLD_FILE                           1\r
-#define OVLD_SRVR_NAME                      2\r
-#define OP_DHCP_MESSAGE_TYPE                53\r
-#define DHCPDISCOVER                        1\r
-#define DHCPOFFER                           2\r
-#define DHCPREQUEST                         3\r
-#define DHCPDECLINE                         4\r
-#define DHCPACK                             5\r
-#define DHCPNAK                             6\r
-#define DHCPRELEASE                         7\r
-#define DHCPINFORM                          8\r
-#define OP_DHCP_SERVER_IP                   54\r
-#define OP_DHCP_PARM_REQ_LIST               55\r
-#define OP_DHCP_ERROR_MESSAGE               56\r
-#define OP_DHCP_MAX_MESSAGE_SZ              57\r
-#define OP_DHCP_RENEWAL_TIME                58\r
-#define OP_DHCP_REBINDING_TIME              59\r
-#define OP_DHCP_CLASS_IDENTIFIER            60\r
-#define OP_DHCP_CLIENT_IDENTIFIER           61\r
-#define OP_NISPLUS_DOMAIN_NAME              64\r
-#define OP_NISPLUS_SERVERS                  65\r
-#define OP_DHCP_TFTP_SERVER_NAME            66\r
-#define OP_DHCP_BOOTFILE                    67\r
-#define OP_MOBILE_IP_HOME_AGENTS            68\r
-#define OP_SMPT_SERVERS                     69\r
-#define OP_POP3_SERVERS                     70\r
-#define OP_NNTP_SERVERS                     71\r
-#define OP_WWW_SERVERS                      72\r
-#define OP_FINGER_SERVERS                   73\r
-#define OP_IRC_SERVERS                      74\r
-#define OP_STREET_TALK_SERVERS              75\r
-#define OP_STREET_TALK_DIR_ASSIST_SERVERS   76\r
-#define OP_NDS_SERVERS                      85\r
-#define OP_NDS_TREE_NAME                    86\r
-#define OP_NDS_CONTEXT                      87\r
-#define OP_DHCP_SYSTEM_ARCH                 93\r
-#define OP_DHCP_NETWORK_ARCH                94\r
-#define OP_DHCP_PLATFORM_ID                 97\r
-} DHCPV4_STRUCT;\r
-\r
-//\r
-// DHCPv4 option header\r
-//\r
-typedef struct {\r
-  UINT8 OpCode;\r
-  UINT8 Length;\r
-  //\r
-  // followed by Data[]\r
-  //\r
-} DHCPV4_OP_HEADER;\r
-\r
-//\r
-// Generic DHCPv4 option (header followed by data)\r
-//\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT8             Data[1];\r
-} DHCPV4_OP_STRUCT;\r
-\r
-//\r
-// Maximum DHCP packet size on ethernet\r
-//\r
-#define MAX_DHCP_MSG_SZ (MAX_ENET_DATA_SIZE - sizeof (IPV4_HEADER) - sizeof (UDPV4_HEADER))\r
-\r
-//\r
-// Macros used in pxe_bc_dhcp.c and pxe_loadfile.c\r
-//\r
-#define DHCPV4_TRANSMIT_BUFFER  (*(DHCPV4_STRUCT *) (Private->TransmitBuffer))\r
-#define DHCPV4_OPTIONS_BUFFER   (*(struct optionsstr *) DHCPV4_TRANSMIT_BUFFER.options)\r
-\r
-#define DHCPV4_ACK_INDEX        0\r
-#define PXE_BINL_INDEX          1\r
-#define PXE_OFFER_INDEX         1\r
-#define PXE_ACK_INDEX           2\r
-#define PXE_BIS_INDEX           3\r
-\r
-#define DHCPV4_ACK_BUFFER       ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[DHCPV4_ACK_INDEX]\r
-#define PXE_BINL_BUFFER         ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BINL_INDEX]\r
-#define PXE_OFFER_BUFFER        ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_OFFER_INDEX]\r
-#define PXE_ACK_BUFFER          ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_ACK_INDEX]\r
-#define PXE_BIS_BUFFER          ((struct DhcpReceiveBufferStruct *) Private->DhcpPacketBuffer)[PXE_BIS_INDEX]\r
-\r
-#define DHCPV4_ACK_PACKET       DHCPV4_ACK_BUFFER.u.Dhcpv4\r
-#define PXE_BINL_PACKET         PXE_BINL_BUFFER.u.Dhcpv4\r
-#define PXE_OFFER_PACKET        PXE_OFFER_BUFFER.u.Dhcpv4\r
-#define PXE_ACK_PACKET          PXE_ACK_BUFFER.u.Dhcpv4\r
-#define PXE_BIS_PACKET          PXE_BIS_BUFFER.u.Dhcpv4\r
-\r
-//\r
-// network structure definitions\r
-//\r
-//\r
-// some option definitions\r
-//\r
-#define DHCPV4_OPTION_LENGTH(type)  (sizeof (type) - sizeof (DHCPV4_OP_HEADER))\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT8             Type;\r
-} DHCPV4_OP_MESSAGE_TYPE;\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT8             Overload;\r
-} DHCPV4_OP_OVERLOAD;\r
-\r
-//\r
-// boot server list structure\r
-// one or more contained in a pxe boot servers structure\r
-//\r
-typedef struct {\r
-  UINT8             IpCount;\r
-  EFI_IPv4_ADDRESS  IpList[1];  // IP count of IPs\r
-} PXEV4_SERVER_LIST;\r
-\r
-typedef struct {\r
-  UINT8             IpCount;\r
-  EFI_IPv6_ADDRESS  IpList[1];  // IP count of IPs\r
-} PXEV6_SERVER_LIST;\r
-\r
-typedef union {\r
-  PXEV4_SERVER_LIST Ipv4List;\r
-  PXEV6_SERVER_LIST Ipv6List;\r
-} PXE_SERVER_LISTS;\r
-\r
-typedef struct {\r
-  UINT16            Type;\r
-  PXE_SERVER_LISTS  u;\r
-} PXE_SERVER_LIST;\r
-\r
-//\r
-// pxe boot servers structure\r
-//\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  PXE_SERVER_LIST   ServerList[1];  // one or more\r
-} PXE_OP_SERVER_LIST;\r
-\r
-//\r
-// pxe boot item structure\r
-//\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT16            Type;\r
-  UINT16            Layer;\r
-} PXE_OP_BOOT_ITEM;\r
-\r
-//\r
-// pxe boot menu item structure\r
-//\r
-typedef struct {\r
-  UINT16  Type;\r
-  UINT8   DataLen;\r
-  UINT8   Data[1];\r
-} PXE_BOOT_MENU_ENTRY;\r
-\r
-//\r
-// pxe boot menu structure\r
-//\r
-typedef struct {\r
-  DHCPV4_OP_HEADER    Header;\r
-  PXE_BOOT_MENU_ENTRY MenuItem[1];\r
-} PXE_OP_BOOT_MENU;\r
-\r
-//\r
-// pxe boot prompt structure\r
-//\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT8             Timeout;\r
-  UINT8             Prompt[1];\r
-} PXE_OP_BOOT_PROMPT;\r
-\r
-#define PXE_BOOT_PROMPT_AUTO_SELECT 0\r
-#define PXE_BOOT_PROMPT_NO_TIMEOUT  255\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT8             Class[1];\r
-} DHCPV4_OP_CLASS;\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT8             File[1];\r
-} DHCPV4_OP_BOOTFILE;\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT8             VendorOptions[1];\r
-} DHCPV4_OP_VENDOR_OPTIONS;\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT8             MaxSize[2];\r
-} DHCPV4_OP_MAX_MESSAGE_SIZE;\r
-\r
-typedef struct {\r
-  UINT8 _OP_SUBNET_MASK;            /* 1 */\r
-  UINT8 _OP_TIME_OFFSET;            /* 2 */\r
-  UINT8 _OP_ROUTER_LIST;            /* 3 */\r
-  UINT8 _OP_TIME_SERVERS;           /* 4 */\r
-  UINT8 _OP_NAME_SERVERS;           /* 5 */\r
-  UINT8 _OP_DNS_SERVERS;            /* 6 */\r
-  UINT8 _OP_HOST_NAME;              /* 12 */\r
-  UINT8 _OP_BOOT_FILE_SZ;           /* 13 */\r
-  UINT8 _OP_DOMAIN_NAME;            /* 15 */\r
-  UINT8 _OP_ROOT_PATH;              /* 17 */\r
-  UINT8 _OP_EXTENSION_PATH;         /* 18 */\r
-  UINT8 _OP_MAX_DATAGRAM_SZ;        /* 22 */\r
-  UINT8 _OP_DEFAULT_TTL;            /* 23 */\r
-  UINT8 _OP_BROADCAST_ADD;          /* 28 */\r
-  UINT8 _OP_NIS_DOMAIN_NAME;        /* 40 */\r
-  UINT8 _OP_NIS_SERVERS;            /* 41 */\r
-  UINT8 _OP_NTP_SERVERS;            /* 42 */\r
-  UINT8 _OP_VENDOR_SPECIFIC;        /* 43 */\r
-  UINT8 _OP_DHCP_REQ_IP_ADD;        /* 50 */\r
-  UINT8 _OP_DHCP_LEASE_TIME;        /* 51 */\r
-  UINT8 _OP_DHCP_SERVER_IP;         /* 54 */\r
-  UINT8 _OP_DHCP_RENEWAL_TIME;      /* 58 */\r
-  UINT8 _OP_DHCP_REBINDING_TIME;    /* 59 */\r
-  UINT8 _OP_DHCP_CLASS_IDENTIFIER;  /* 60 */\r
-  UINT8 _OP_DHCP_TFTP_SERVER_NAME;  /* 66 */\r
-  UINT8 _OP_DHCP_BOOTFILE;          /* 67 */\r
-  UINT8 _OP_DHCP_PLATFORM_ID;       /* 97 */\r
-  UINT8 VendorOption128;            //      vendor option 128\r
-  UINT8 VendorOption129;            //      vendor option 129\r
-  UINT8 VendorOption130;            //      vendor option 130\r
-  UINT8 VendorOption131;            //      vendor option 131\r
-  UINT8 VendorOption132;            //      vendor option 132\r
-  UINT8 VendorOption133;            //      vendor option 133\r
-  UINT8 VendorOption134;            //      vendor option 134\r
-  UINT8 VendorOption135;            //      vendor option 135\r
-} DHCPV4_REQUESTED_OPTIONS_DATA;\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER              Header;\r
-  DHCPV4_REQUESTED_OPTIONS_DATA Data;\r
-} DHCPV4_OP_REQUESTED_OPTIONS;\r
-\r
-typedef struct opipstr {\r
-  DHCPV4_OP_HEADER  Header;\r
-  EFI_IPv4_ADDRESS  Ip;\r
-} DHCPV4_OP_IP_ADDRESS;\r
-\r
-//\r
-// ip list structure - e.g. router list\r
-//\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  EFI_IPv4_ADDRESS  IpList[1];\r
-} DHCPV4_OP_IP_LIST;\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT8             Type;\r
-  UINT8             Guid[sizeof (EFI_GUID)];\r
-} DHCPV4_OP_CLIENT_ID;\r
-\r
-//\r
-// special options start - someday obsolete ???\r
-//\r
-#define DHCPV4_OP_PLATFORM_ID DHCPV4_OP_CLIENT_ID\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT8             Type; // SNP = 2\r
-  UINT8             MajorVersion;\r
-  UINT8             MinorVersion;\r
-} DHCPV4_OP_NETWORK_INTERFACE;\r
-\r
-#define UNDI_TYPE 1\r
-#define SNP_TYPE  2\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT16            Type;\r
-} DHCPV4_OP_ARCHITECTURE_TYPE;\r
-//\r
-// special options end - someday obsolete ???\r
-//\r
-typedef struct {\r
-  UINT8 ClassIdentifier[10];  // PXEClient:\r
-  UINT8 Lit2[5];              // Arch:\r
-  UINT8 ArchitectureType[5];  // 00000 - 65536\r
-  UINT8 Lit3[1];              // :\r
-  UINT8 InterfaceName[4];     // e.g. UNDI\r
-  UINT8 Lit4[1];              // :\r
-  UINT8 UndiMajor[3];         // 000 - 255\r
-  UINT8 UndiMinor[3];         // 000 - 255\r
-} DHCPV4_CLASS_ID_DATA;\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER      Header;\r
-  DHCPV4_CLASS_ID_DATA  Data;\r
-} DHCPV4_OP_CLASS_ID;\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  EFI_IPv4_ADDRESS  Ip;\r
-} DHCPV4_OP_REQUESTED_IP;\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  EFI_IPv4_ADDRESS  Ip;\r
-} DHCPV4_OP_SERVER_IP;\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  EFI_IPv4_ADDRESS  Ip;\r
-} DHCPV4_OP_SUBNET_MASK;\r
-\r
-typedef struct {              // oppxedisctlstr {\r
-  DHCPV4_OP_HEADER  Header;\r
-  UINT8             ControlBits;\r
-} PXE_OP_DISCOVERY_CONTROL;\r
-\r
-#define DISABLE_BCAST   (1 << 0)\r
-#define DISABLE_MCAST   (1 << 1)\r
-#define USE_ACCEPT_LIST (1 << 2)\r
-#define USE_BOOTFILE    (1 << 3)\r
-\r
-#pragma pack()\r
-//\r
-// definitions of indices to populate option interest array\r
-//\r
-#define VEND_PXE_MTFTP_IP_IX              1                     // multicast IP address of bootfile for MTFTP listen\r
-#define VEND_PXE_MTFTP_CPORT_IX           2                     // UDP Port to monitor for MTFTP responses - Intel order\r
-#define VEND_PXE_MTFTP_SPORT_IX           3                     // Server UDP Port for MTFTP open - Intel order\r
-#define VEND_PXE_MTFTP_TMOUT_IX           4                     // Listen timeout - secs\r
-#define VEND_PXE_MTFTP_DELAY_IX           5                     // Transmission timeout - secs\r
-#define VEND_PXE_DISCOVERY_CONTROL_IX     6                     // bit field\r
-#define VEND_PXE_DISCOVERY_MCAST_ADDR_IX  7                     // boot server discovery multicast address\r
-#define VEND_PXE_BOOT_SERVERS_IX          8                     // list of boot servers of form tp(2) cnt(1) ips[cnt]\r
-#define VEND_PXE_BOOT_MENU_IX             9\r
-#define VEND_PXE_BOOT_PROMPT_IX           10\r
-#define VEND_PXE_MCAST_ADDRS_ALLOC_IX     0                     // not used by PXE client\r
-#define VEND_PXE_CREDENTIAL_TYPES_IX      11\r
-#define VEND_13_IX                        0                     // not used by PXE client\r
-#define VEND_14_IX                        0                     // not used by PXE client\r
-#define VEND_15_IX                        0                     // not used by PXE client\r
-#define VEND_16_IX                        0                     // not used by PXE client\r
-#define VEND_17_IX                        0                     // not used by PXE client\r
-#define VEND_18_IX                        0                     // not used by PXE client\r
-#define VEND_19_IX                        0                     // not used by PXE client\r
-#define VEND_20_IX                        0                     // not used by PXE client\r
-#define VEND_21_IX                        0                     // not used by PXE client\r
-#define VEND_22_IX                        0                     // not used by PXE client\r
-#define VEND_23_IX                        0                     // not used by PXE client\r
-#define VEND_24_IX                        0                     // not used by PXE client\r
-#define VEND_25_IX                        0                     // not used by PXE client\r
-#define VEND_26_IX                        0                     // not used by PXE client\r
-#define VEND_27_IX                        0                     // not used by PXE client\r
-#define VEND_28_IX                        0                     // not used by PXE client\r
-#define VEND_29_IX                        0                     // not used by PXE client\r
-#define VEND_30_IX                        0                     // not used by PXE client\r
-#define VEND_31_IX                        0                     // not used by PXE client\r
-#define VEND_32_IX                        0                     // not used by PXE client\r
-#define VEND_33_IX                        0                     // not used by PXE client\r
-#define VEND_34_IX                        0                     // not used by PXE client\r
-#define VEND_35_IX                        0                     // not used by PXE client\r
-#define VEND_36_IX                        0                     // not used by PXE client\r
-#define VEND_37_IX                        0                     // not used by PXE client\r
-#define VEND_38_IX                        0                     // not used by PXE client\r
-#define VEND_39_IX                        0                     // not used by PXE client\r
-#define VEND_40_IX                        0                     // not used by PXE client\r
-#define VEND_41_IX                        0                     // not used by PXE client\r
-#define VEND_42_IX                        0                     // not used by PXE client\r
-#define VEND_43_IX                        0                     // not used by PXE client\r
-#define VEND_44_IX                        0                     // not used by PXE client\r
-#define VEND_45_IX                        0                     // not used by PXE client\r
-#define VEND_46_IX                        0                     // not used by PXE client\r
-#define VEND_47_IX                        0                     // not used by PXE client\r
-#define VEND_48_IX                        0                     // not used by PXE client\r
-#define VEND_49_IX                        0                     // not used by PXE client\r
-#define VEND_50_IX                        0                     // not used by PXE client\r
-#define VEND_51_IX                        0                     // not used by PXE client\r
-#define VEND_52_IX                        0                     // not used by PXE client\r
-#define VEND_53_IX                        0                     // not used by PXE client\r
-#define VEND_54_IX                        0                     // not used by PXE client\r
-#define VEND_55_IX                        0                     // not used by PXE client\r
-#define VEND_56_IX                        0                     // not used by PXE client\r
-#define VEND_57_IX                        0                     // not used by PXE client\r
-#define VEND_58_IX                        0                     // not used by PXE client\r
-#define VEND_59_IX                        0                     // not used by PXE client\r
-#define VEND_60_IX                        0                     // not used by PXE client\r
-#define VEND_61_IX                        0                     // not used by PXE client\r
-#define VEND_62_IX                        0                     // not used by PXE client\r
-#define VEND_63_IX                        0                     // not used by PXE client\r
-#define VEND_64_IX                        0                     // not used by PXE client\r
-#define VEND_65_IX                        0                     // not used by PXE client\r
-#define VEND_66_IX                        0                     // not used by PXE client\r
-#define VEND_67_IX                        0                     // not used by PXE client\r
-#define VEND_68_IX                        0                     // not used by PXE client\r
-#define VEND_69_IX                        0                     // not used by PXE client\r
-#define VEND_70_IX                        0                     // not used by PXE client\r
-#define VEND_PXE_BOOT_ITEM_IX             12\r
-\r
-#define MAX_OUR_PXE_OPT                   VEND_PXE_BOOT_ITEM    // largest PXE option in which we are interested\r
-#define MAX_OUR_PXE_IX                    VEND_PXE_BOOT_ITEM_IX // largest PXE option index\r
-//\r
-// define various types by options that are sent\r
-//\r
-#define WfM11a_OPTS   ((1<<VEND_PXE_MTFTP_IP_IX) | \\r
-                      (1<<VEND_PXE_MTFTP_CPORT_IX) | \\r
-                      (1<<VEND_PXE_MTFTP_SPORT_IX) | \\r
-                      (1<<VEND_PXE_MTFTP_TMOUT_IX) | \\r
-                      (1<<VEND_PXE_MTFTP_DELAY_IX))\r
-\r
-#define DISCOVER_OPTS ((1<<VEND_PXE_DISCOVERY_CONTROL_IX) | \\r
-                      (1<<VEND_PXE_DISCOVERY_MCAST_ADDR_IX) | \\r
-                      (1<<VEND_PXE_BOOT_SERVERS_IX) | \\r
-                      (1<<VEND_PXE_BOOT_MENU_IX) | \\r
-                      (1<<VEND_PXE_BOOT_PROMPT_IX) | \\r
-                      (1<<VEND_PXE_BOOT_ITEM_IX))\r
-\r
-#define CREDENTIALS_OPT (1 << VEND_PXE_CREDENTIAL_TYPES_IX)\r
-\r
-//\r
-// definitions of indices to populate option interest array\r
-//\r
-#define OP_SUBNET_MASK_IX                     1\r
-#define OP_TIME_OFFSET_IX                     0 // not used by PXE client\r
-#define OP_ROUTER_LIST_IX                     2\r
-#define OP_TIME_SERVERS_IX                    0 // not used by PXE client\r
-#define OP_NAME_SERVERS_IX                    0 // not used by PXE client\r
-#define OP_DNS_SERVERS_IX                     0 // not used by PXE client\r
-#define OP_LOG_SERVERS_IX                     0 // not used by PXE client\r
-#define OP_COOKIE_SERVERS_IX                  0 // not used by PXE client\r
-#define OP_LPR_SREVERS_IX                     0 // not used by PXE client\r
-#define OP_IMPRESS_SERVERS_IX                 0 // not used by PXE client\r
-#define OP_RES_LOC_SERVERS_IX                 0 // not used by PXE client\r
-#define OP_HOST_NAME_IX                       0 // not used by PXE client\r
-#define OP_BOOT_FILE_SZ_IX                    9\r
-#define OP_DUMP_FILE_IX                       0 // not used by PXE client\r
-#define OP_DOMAIN_NAME_IX                     0 // not used by PXE client\r
-#define OP_SWAP_SERVER_IX                     0 // not used by PXE client\r
-#define OP_ROOT_PATH_IX                       0 // not used by PXE client\r
-#define OP_EXTENSION_PATH_IX                  0 // not used by PXE client\r
-#define OP_IP_FORWARDING_IX                   0 // not used by PXE client\r
-#define OP_NON_LOCAL_SRC_RTE_IX               0 // not used by PXE client\r
-#define OP_POLICY_FILTER_IX                   0 // not used by PXE client\r
-#define OP_MAX_DATAGRAM_SZ_IX                 0 // not used by PXE client\r
-#define OP_DEFAULT_TTL_IX                     0 // not used by PXE client\r
-#define OP_MTU_AGING_TIMEOUT_IX               0 // not used by PXE client\r
-#define OP_MTU_SIZES_IX                       0 // not used by PXE client\r
-#define OP_MTU_TO_USE_IX                      0 // not used by PXE client\r
-#define OP_ALL_SUBNETS_LOCAL_IX               0 // not used by PXE client\r
-#define OP_BROADCAST_ADD_IX                   0 // not used by PXE client\r
-#define OP_PERFORM_MASK_DISCOVERY_IX          0 // not used by PXE client\r
-#define OP_RESPOND_TO_MASK_REQ_IX             0 // not used by PXE client\r
-#define OP_PERFORM_ROUTER_DISCOVERY_IX        0 // not used by PXE client\r
-#define OP_ROUTER_SOLICIT_ADDRESS_IX          0 // not used by PXE client\r
-#define OP_STATIC_ROUTER_LIST_IX              0 // not used by PXE client\r
-#define OP_USE_ARP_TRAILERS_IX                0 // not used by PXE client\r
-#define OP_ARP_CACHE_TIMEOUT_IX               0 // not used by PXE client\r
-#define OP_ETHERNET_ENCAPSULATION_IX          0 // not used by PXE client\r
-#define OP_TCP_DEFAULT_TTL_IX                 0 // not used by PXE client\r
-#define OP_TCP_KEEP_ALIVE_INT_IX              0 // not used by PXE client\r
-#define OP_KEEP_ALIVE_GARBAGE_IX              0 // not used by PXE client\r
-#define OP_NIS_DOMAIN_NAME_IX                 0 // not used by PXE client\r
-#define OP_NIS_SERVERS_IX                     0 // not used by PXE client\r
-#define OP_NTP_SERVERS_IX                     0 // not used by PXE client\r
-#define OP_VENDOR_SPECIFIC_IX                 3\r
-#define OP_NBNS_SERVERS_IX                    0 // not used by PXE client\r
-#define OP_NBDD_SERVERS_IX                    0 // not used by PXE client\r
-#define OP_NETBIOS_NODE_TYPE_IX               0 // not used by PXE client\r
-#define OP_NETBIOS_SCOPE_IX                   0 // not used by PXE client\r
-#define OP_XWINDOW_SYSTEM_FONT_SERVERS_IX     0 // not used by PXE client\r
-#define OP_XWINDOW_SYSTEM_DISPLAY_MANAGERS_IX 0 // not used by PXE client\r
-// DHCP option indices\r
-//\r
-#define OP_DHCP_REQ_IP_ADD_IX         0                 // not used by PXE client\r
-#define OP_DHCP_LEASE_TIME_IX         0                 // not used by PXE client\r
-#define OP_DHCP_OPTION_OVERLOAD_IX    4\r
-#define OP_DHCP_MESSAGE_TYPE_IX       5\r
-#define OP_DHCP_SERVER_IP_IX          6\r
-#define OP_DHCP_PARM_REQ_LIST_IX      0                 // not used by PXE client\r
-#define OP_DHCP_ERROR_MESSAGE_IX      0                 // not used by PXE client\r
-#define OP_DHCP_MAX_MESSAGE_SZ_IX     0                 // not used by PXE client\r
-#define OP_DHCP_RENEWAL_TIME_IX       0                 // not used by PXE client\r
-#define OP_DHCP_REBINDING_TIME_IX     0                 // not used by PXE client\r
-#define OP_DHCP_CLASS_IDENTIFIER_IX   7\r
-#define OP_DHCP_CLIENT_IDENTIFIER_IX  0                 // not used by PXE client\r
-#define OP_RESERVED62_IX              0                 // not used by PXE client\r
-#define OP_RESERVED63_IX              0                 // not used by PXE client\r
-#define OP_NISPLUS_DOMAIN_NAME_IX     0                 // not used by PXE client\r
-#define OP_NISPLUS_SERVERS_IX         0                 // not used by PXE client\r
-#define OP_DHCP_TFTP_SERVER_NAME_IX   0                 // not used by PXE client\r
-#define OP_DHCP_BOOTFILE_IX           8\r
-\r
-#define MAX_OUR_OPT                   OP_DHCP_BOOTFILE  // largest option in which we are interested\r
-#define MAX_OUR_IX                    OP_BOOT_FILE_SZ_IX\r
-\r
-typedef struct {\r
-  DHCPV4_OP_STRUCT  *PktOptAdds[MAX_OUR_IX];\r
-  DHCPV4_OP_STRUCT  *PxeOptAdds[MAX_OUR_PXE_IX];\r
-  UINT8             Status;\r
-} OPTION_POINTERS;\r
-\r
-typedef struct DhcpReceiveBufferStruct {\r
-  union {\r
-    UINT8         ReceiveBuffer[MAX_DHCP_MSG_SZ];\r
-    DHCPV4_STRUCT Dhcpv4;\r
-  } u;\r
-\r
-  OPTION_POINTERS OpAdds;\r
-} DHCP_RECEIVE_BUFFER;\r
-\r
-#define PXE_TYPE          (1 << 0)\r
-#define WfM11a_TYPE       (1 << 1)\r
-#define DISCOVER_TYPE     (1 << 2)\r
-#define CREDENTIALS_TYPE  (1 << 3)\r
-#define USE_THREE_BYTE    (1 << 4)\r
-\r
-#endif // _DHCP_H\r
-\r
-/* EOF - dhcp.h */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Ebc/PxeArch.c b/MdeModulePkg/Universal/Network/PxeBcDxe/Ebc/PxeArch.c
deleted file mode 100644 (file)
index 026dd24..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeArch.c\r
-\r
-Abstract:\r
-  Defines PXE Arch type\r
-\r
-\r
-**/\r
-\r
-\r
-#include "PxeArch.h"\r
-\r
-UINT16 mSysArch = 0;\r
-\r
-UINT16\r
-GetSysArch (\r
-  VOID\r
-  )\r
-{\r
-  if (mSysArch == 0) {\r
-    //\r
-    // This is first call\r
-    // Assign to invalid value\r
-    //\r
-    mSysArch = 0xFFFF;\r
-\r
-    //\r
-    // We do not know what is EBC architecture.\r
-    // Maybe we can try to locate DebugSupport protocol to get ISA.\r
-    // TBD now.\r
-    //\r
-  }\r
-\r
-  return mSysArch;\r
-}\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Ebc/PxeArch.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Ebc/PxeArch.h
deleted file mode 100644 (file)
index 8935067..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeArch.h\r
-\r
-Abstract:\r
-  Defines PXE Arch type\r
-\r
-\r
-**/\r
-\r
-#ifndef _EFI_PXE_ARCH_H_\r
-#define _EFI_PXE_ARCH_H_\r
-\r
-//\r
-// warning #175: subscript out of range\r
-//\r
-#pragma warning (disable: 175)\r
-\r
-#define SYS_ARCH GetSysArch()\r
-\r
-UINT16\r
-GetSysArch (\r
-  VOID\r
-  );\r
-\r
-#endif\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Hton.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Hton.h
deleted file mode 100644 (file)
index 1da5624..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module name:\r
-  hton.h\r
-\r
-Abstract:\r
-  Byte swapping macros.\r
-\r
-\r
-**/\r
-\r
-#ifndef _HTON_H_\r
-#define _HTON_H_\r
-\r
-//\r
-// Only Intel order functions are defined at this time.\r
-//\r
-#define HTONS(v)  (UINT16) ((((v) << 8) & 0xff00) + (((v) >> 8) & 0x00ff))\r
-\r
-#define HTONL(v) \\r
-  (UINT32) ((((v) << 24) & 0xff000000) + (((v) << 8) & 0x00ff0000) + (((v) >> 8) & 0x0000ff00) + (((v) >> 24) & 0x000000ff))\r
-\r
-#define HTONLL(v) swap64 (v)\r
-\r
-#define U8PTR(na) ((UINT8 *) &(na))\r
-\r
-#define NTOHS(ns) ((UINT16) (((*U8PTR (ns)) << 8) +*(U8PTR (ns) + 1)))\r
-\r
-#define NTOHL(ns) \\r
-    ((UINT32) (((*U8PTR (ns)) << 24) + ((*(U8PTR (ns) + 1)) << 16) + ((*(U8PTR (ns) + 2)) << 8) +*(U8PTR (ns) + 3)))\r
-\r
-#endif /* _HTON_H_ */\r
-\r
-/* EOF - hton.h */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Ia32/PxeArch.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Ia32/PxeArch.h
deleted file mode 100644 (file)
index d032f62..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeArch.h\r
-\r
-Abstract:\r
-  Defines PXE Arch type\r
-\r
-\r
-**/\r
-\r
-#ifndef _EFI_PXE_ARCH_H_\r
-#define _EFI_PXE_ARCH_H_\r
-\r
-#define SYS_ARCH  0x6\r
-\r
-#endif\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Ip.h
deleted file mode 100644 (file)
index 158fce6..0000000
+++ /dev/null
@@ -1,708 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-\r
-**/\r
-\r
-#ifndef _IP_H_\r
-#define _IP_H_\r
-\r
-#include "Hton.h"\r
-\r
-//\r
-// portability macros\r
-//\r
-#define UDP_FILTER_MASK  (EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP | \\r
-                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT | \\r
-                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP | \\r
-                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT | \\r
-                         EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER \\r
-          )\r
-\r
-#define PXE_BOOT_LAYER_MASK             0x7FFF\r
-#define PXE_BOOT_LAYER_INITIAL          0x0000\r
-#define PXE_BOOT_LAYER_CREDENTIAL_FLAG  0x8000\r
-#define MAX_BOOT_SERVERS                32\r
-\r
-//\r
-// macro to evaluate IP address as TRUE if it is a multicast IP address\r
-//\r
-#define IS_MULTICAST(ptr) ((*((UINT8 *) ptr) & 0xf0) == 0xe0)\r
-\r
-//\r
-// length macros\r
-//\r
-#define IP_ADDRESS_LENGTH(qp)   (((qp)->UsingIpv6) ? sizeof (EFI_IPv6_ADDRESS) : sizeof (EFI_IPv4_ADDRESS))\r
-\r
-#define MAX_FRAME_DATA_SIZE     1488\r
-#define ALLOCATE_SIZE(X)        (((X) + 7) & 0xfff8)\r
-#define MODE_ALLOCATE_SIZE      ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_MODE))\r
-#define BUFFER_ALLOCATE_SIZE    (8192 + 512)\r
-#define ROUTER_ALLOCATE_SIZE    ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ROUTE_ENTRY) * PXE_ROUTER_TABLE_SIZE))\r
-#define ARP_ALLOCATE_SIZE       ALLOCATE_SIZE ((sizeof (EFI_PXE_BASE_CODE_ARP_ENTRY) * PXE_ARP_CACHE_SIZE))\r
-#define FILTER_ALLOCATE_SIZE    ALLOCATE_SIZE ((sizeof (EFI_IP_ADDRESS) * PXE_IP_FILTER_SIZE))\r
-#define PXE_ARP_CACHE_SIZE      8\r
-#define PXE_ROUTER_TABLE_SIZE   8\r
-#define PXE_IP_FILTER_SIZE      8\r
-#define ICMP_ALLOCATE_SIZE      ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR))\r
-#define TFTP_ERR_ALLOCATE_SIZE  ALLOCATE_SIZE (sizeof (EFI_PXE_BASE_CODE_TFTP_ERROR))\r
-\r
-//\r
-// DHCP discover/request packets are sent to this UDP port.  ProxyDHCP\r
-// servers listen on this port for DHCP discover packets that have a\r
-// class identifier (option 60) with 'PXEClient' in the first 9 bytes.\r
-// Bootservers also listen on this port for PXE broadcast discover\r
-// requests from PXE clients.\r
-//\r
-#define DHCP_SERVER_PORT  67\r
-\r
-//\r
-// When DHCP, proxyDHCP and Bootservers respond to DHCP and PXE broadcast\r
-// discover requests by broadcasting the reply packet, the packet is\r
-// broadcast to this port.\r
-//\r
-#define DHCP_CLIENT_PORT  68\r
-\r
-//\r
-// TFTP servers listen for TFTP open requests on this port.\r
-//\r
-#define TFTP_OPEN_PORT  69\r
-\r
-//\r
-// proxyDHCP and Bootservers listen on this port for a PXE unicast and/or\r
-// multicast discover requests from PXE clients.  A PXE discover request\r
-// looks like a DHCP discover or DHCP request packet.\r
-//\r
-#define PXE_DISCOVERY_PORT  4011\r
-\r
-//\r
-// This port is used by the PXE client/server protocol tests.\r
-//\r
-#define PXE_PORT_PXETEST_PORT 0x8080\r
-\r
-//\r
-// Definitions for Ethertype protocol numbers and interface types\r
-// Per RFC 1700,\r
-//\r
-#define PXE_PROTOCOL_ETHERNET_IP    0x0800\r
-#define PXE_PROTOCOL_ETHERNET_ARP   0x0806\r
-#define PXE_PROTOCOL_ETHERNET_RARP  0x8035\r
-\r
-#define PXE_IFTYPE_ETHERNET         0x01\r
-#define PXE_IFTYPE_TOKENRING        0x04\r
-#define PXE_IFTYPE_FIBRE_CHANNEL    0x12\r
-\r
-//\r
-// Definitions for internet protocol version 4 header\r
-// Per RFC 791, September 1981.\r
-//\r
-#define IPVER4  4\r
-\r
-#pragma pack(1) // make network structures packed byte alignment\r
-typedef union {\r
-  UINT8   B[4];\r
-  UINT32  L;\r
-} IPV4_ADDR;\r
-\r
-#define IPV4_HEADER_LENGTH(IpHeaderPtr) (((IpHeaderPtr)->VersionIhl & 0xf) << 2)\r
-\r
-#define SET_IPV4_VER_HDL(IpHeaderPtr, IpHeaderLen) { \\r
-    (IpHeaderPtr)->VersionIhl = (UINT8) ((IPVER4 << 4) | ((IpHeaderLen) >> 2)); \\r
-  }\r
-\r
-typedef struct {\r
-  UINT8     VersionIhl;\r
-  UINT8     TypeOfService;\r
-  UINT16    TotalLength;\r
-  UINT16    Id;\r
-  UINT16    FragmentFields;\r
-  UINT8     TimeToLive;\r
-  UINT8     Protocol;\r
-  UINT16    HeaderChecksum;\r
-  IPV4_ADDR SrcAddr;\r
-  IPV4_ADDR DestAddr;\r
-  //\r
-  // options are not implemented\r
-  //\r
-} IPV4_HEADER;\r
-\r
-#define IP_FRAG_RSVD    0x8000  // reserved bit - must be zero\r
-#define IP_NO_FRAG      0x4000  // do not fragment bit\r
-#define IP_MORE_FRAG    0x2000  // not last fragment\r
-#define IP_FRAG_OFF_MSK 0x1fff  // fragment offset in 8 byte chunks\r
-#define DEFAULT_RFC_TTL 64\r
-\r
-#define PROT_ICMP       1\r
-#define PROT_IGMP       2\r
-#define PROT_TCP        6\r
-#define PROT_UDP        17\r
-\r
-/*\r
- * Definitions for internet control message protocol version 4 message\r
- * structure.  Per RFC 792, September 1981.\r
- */\r
-\r
-//\r
-// icmp header for all icmp messages\r
-//\r
-typedef struct {\r
-  UINT8   Type;     // message type\r
-  UINT8   Code;     // type specific - 0 for types we implement\r
-  UINT16  Checksum; // ones complement of ones complement sum of 16 bit words of message\r
-} ICMPV4_HEADER;\r
-\r
-#define ICMP_DEST_UNREACHABLE   3\r
-#define ICMP_SOURCE_QUENCH      4\r
-#define ICMP_REDIRECT           5\r
-#define ICMP_ECHO               8\r
-#define ICMP_ECHO_REPLY         0\r
-#define ICMP_ROUTER_ADV         9\r
-#define ICMP_ROUTER_SOLICIT     10\r
-#define ICMP_TIME_EXCEEDED      11\r
-#define ICMP_PARAMETER_PROBLEM  12\r
-#define ICMP_TIMESTAMP          13\r
-#define ICMP_TIMESTAMP_REPLY    14\r
-#define ICMP_INFO_REQ           15\r
-#define ICMP_INFO_REQ_REPLY     16\r
-#define ICMP_SUBNET_MASK_REQ    17\r
-#define ICMP_SUBNET_MASK_REPLY  18\r
-//\r
-// other ICMP message types ignored in this implementation\r
-//\r
-// icmp general messages\r
-//\r
-typedef struct {\r
-  ICMPV4_HEADER Header;\r
-  //\r
-  // generally unused except byte [0] for\r
-  // parameter problem message\r
-  //\r
-  UINT8         GenerallyUnused[4];\r
-  //\r
-  // original message ip header of plus 64\r
-  // bits of data\r
-  //\r
-  IPV4_HEADER   IpHeader;\r
-} ICMPV4_GENERAL_MESSAGE;\r
-\r
-//\r
-// icmp req/rply message header\r
-//\r
-typedef struct {\r
-  ICMPV4_HEADER Header;\r
-  UINT16        Id;\r
-  UINT16        SequenceNumber;\r
-} ICMPV4_REQUEST_REPLY_HEADER;\r
-\r
-//\r
-// icmp echo message\r
-//\r
-typedef struct {\r
-  ICMPV4_REQUEST_REPLY_HEADER Header;\r
-  UINT8                       EchoData[1];  // variable length data to be echoed\r
-} ICMPV4_ECHO_MESSAGE;\r
-\r
-//\r
-// icmp timestamp message - times are milliseconds since midnight UT -\r
-// if non std, set high order bit\r
-//\r
-typedef struct {\r
-  ICMPV4_REQUEST_REPLY_HEADER Header;\r
-  UINT32                      OriginalTime; // originating timestamp\r
-  UINT32                      ReceiveTime;  // receiving timestamp\r
-  UINT32                      TransmitTime; // transmitting timestamp\r
-} ICMPV4_TIMESTAMP_MESSAGE;\r
-\r
-//\r
-// icmp info request structure - fill in source and dest net ip address on reply\r
-//\r
-typedef struct {\r
-  ICMPV4_REQUEST_REPLY_HEADER Header;\r
-} ICMPV4_INFO_MESSAGE;\r
-\r
-//\r
-// Definitions for internet control message protocol version 4 message structure\r
-// Router discovery\r
-// Per RFC 1256, September 1991.\r
-//\r
-//\r
-// icmp router advertisement message\r
-//\r
-typedef struct {\r
-  ICMPV4_HEADER Header;\r
-  UINT8         NumberEntries;  // number of address entries\r
-  UINT8         EntrySize;      // number of 32 bit words per address entry\r
-  UINT16        Lifetime;       // seconds to consider info valid\r
-  UINT32        RouterIp;\r
-  UINT32        Preferance;\r
-} ICMPV4_ROUTER_ADVERTISE_MESSAGE;\r
-\r
-//\r
-// icmp router solicitation message\r
-//\r
-typedef struct {\r
-  ICMPV4_HEADER Header;\r
-  UINT32        Reserved;\r
-} ICMPV4_ROUTER_SOLICIT_MESSAGE;\r
-\r
-#define MAX_SOLICITATION_DELAY      1   //  1 second\r
-#define SOLICITATION_INTERVAL       3   //  3 seconds\r
-#define MAX_SOLICITATIONS           3   //  3 transmissions\r
-#define V1ROUTER_PRESENT_TIMEOUT    400 // 400 second timeout until v2 reports can be sent\r
-#define UNSOLICITED_REPORT_INTERVAL 10  // 10 seconds between unsolicited reports\r
-#define BROADCAST_IPv4              0xffffffff\r
-\r
-//\r
-// Definitions for address resolution protocol message structure\r
-// Per RFC 826, November 1982\r
-//\r
-typedef struct {\r
-  UINT16  HwType;     // hardware type - e.g. ethernet (1)\r
-  UINT16  ProtType;   // protocol type - for ethernet, 0x800 for IP\r
-  UINT8   HwAddLen;   // byte length of a hardware address (e.g. 6 for ethernet)\r
-  UINT8   ProtAddLen; // byte length of a protocol address (e.g. 4 for ipv4)\r
-  UINT16  OpCode;\r
-  //\r
-  // source and dest hw and prot addresses follow - see example below\r
-  //\r
-} ARP_HEADER;\r
-\r
-#define ETHERNET_ADD_SPC  1\r
-\r
-#define ETHER_TYPE_IP     0x800\r
-\r
-#define ARP_REQUEST       1\r
-#define ARP_REPLY         2\r
-\r
-//\r
-// generic ARP packet\r
-//\r
-typedef struct {\r
-  ARP_HEADER      ArpHeader;\r
-  EFI_MAC_ADDRESS SrcHardwareAddr;\r
-  EFI_IP_ADDRESS  SrcProtocolAddr;\r
-  EFI_MAC_ADDRESS DestHardwareAddr;\r
-  EFI_IP_ADDRESS  DestProtocolAddr;\r
-} ARP_PACKET;\r
-\r
-#define ENET_HWADDLEN   6\r
-#define IPV4_PROTADDLEN 4\r
-\r
-//\r
-// Definitions for user datagram protocol version 4 pseudo header & header\r
-// Per RFC 768, 28 August 1980\r
-//\r
-typedef struct {\r
-  IPV4_ADDR SrcAddr;      // source ip address\r
-  IPV4_ADDR DestAddr;     // dest ip address\r
-  UINT8     Zero;         // 0\r
-  UINT8     Protocol;     // protocol\r
-  UINT16    TotalLength;  // UDP length - sizeof udpv4hdr + data length\r
-} UDPV4_PSEUDO_HEADER;\r
-\r
-typedef struct {\r
-  UINT16  SrcPort;        // source port identifier\r
-  UINT16  DestPort;       // destination port identifier\r
-  UINT16  TotalLength;    // total length header plus data\r
-  //\r
-  // ones complement of ones complement sum of 16 bit\r
-  // words of pseudo header, UDP header, and data\r
-  // zero checksum is transmitted as -0 (ones comp)\r
-  // zero transmitted means checksum not computed\r
-  // data follows\r
-  //\r
-  UINT16  Checksum;\r
-} UDPV4_HEADER;\r
-\r
-typedef struct {\r
-  UDPV4_PSEUDO_HEADER Udpv4PseudoHeader;\r
-  UDPV4_HEADER        Udpv4Header;\r
-} UDPV4_HEADERS;\r
-\r
-//\r
-// Definitions for transmission control protocol header\r
-// Per RFC 793, September, 1981\r
-//\r
-typedef struct {\r
-  IPV4_ADDR SrcAddr;      // source ip address\r
-  IPV4_ADDR DestAddr;     // dest ip address\r
-  UINT8     Zero;         // 0\r
-  UINT8     Protocol;     // protocol\r
-  UINT16    TotalLength;  // TCP length - TCP header length + data length\r
-} TCPV4_PSEUDO_HEADER;\r
-\r
-typedef struct {\r
-  UINT16  SrcPort;        // source port identifier\r
-  UINT16  DestPort;       // destination port identifier\r
-  UINT32  SeqNumber;      // Sequence number\r
-  UINT32  AckNumber;      // Acknowledgement Number\r
-  //\r
-  // Nibble of HLEN (length of header in 32-bit multiples)\r
-  // 6bits of RESERVED\r
-  // Nibble of Code Bits\r
-  //\r
-  UINT16  HlenResCode;\r
-  UINT16  Window;   // Software buffer size (sliding window size) in network-standard byte order\r
-  //\r
-  // ones complement of ones complement sum of 16 bit words of\r
-  // pseudo header, TCP header, and data\r
-  // zero checksum is transmitted as -0 (ones comp)\r
-  // zero transmitted means checksum not computed\r
-  //\r
-  UINT16  Checksum;\r
-  UINT16  UrgentPointer;                // pointer to urgent data (allows sender to specify urgent data)\r
-} TCPV4_HEADER;\r
-\r
-typedef struct {\r
-  TCPV4_PSEUDO_HEADER Tcpv4PseudoHeader;\r
-  TCPV4_HEADER        Tcpv4Header;\r
-} TCPV4_HEADERS;\r
-\r
-typedef struct {\r
-  UINT8 Kind;                           // one of the following:\r
-  UINT8 Length;                         // total option length including Kind and Lth\r
-  UINT8 Data[1];                        // length = Lth - 2\r
-} TCPV4_OPTION;\r
-\r
-#define TCP_OP_END                0     // only used to pad to end of TCP header\r
-#define TCP_NOP                   1     // optional - may be used to pad between options to get alignment\r
-#define TCP_MAX_SEG               2     // maximum receive segment size - only send at initial connection request\r
-#define MAX_MEDIA_HDR_SIZE        64\r
-#define MIN_ENET_DATA_SIZE        64\r
-#define MAX_ENET_DATA_SIZE        1500  // temp def - make a network based var\r
-#define MAX_IPV4_PKT_SIZE         65535 // maximum IP packet size\r
-#define MAX_IPV4_DATA_SIZE        (MAX_IPV4_PKT_SIZE - sizeof (IPV4_HEADER))\r
-#define MAX_IPV4_FRAME_DATA_SIZE  (MAX_FRAME_DATA_SIZE - sizeof (IPV4_HEADER))\r
-#define REAS_IPV4_PKT_SIZE        576   // minimum IP packet size all IP host can handle\r
-#define REAS_IPV4_DATA_SIZE       (REAS_IPV4_PKT_SIZE - sizeof (IPV4_HEADER))\r
-\r
-//\r
-//\r
-//\r
-typedef union {\r
-  UINT8           Data[MAX_ENET_DATA_SIZE];\r
-  ICMPV4_HEADER   IcmpHeader;\r
-  IGMPV2_MESSAGE  IgmpMessage;\r
-  struct {\r
-    UDPV4_HEADER  UdpHeader;\r
-    UINT8         Data[1];\r
-  } Udp;\r
-  struct {\r
-    TCPV4_HEADER  TcpHeader;\r
-    UINT8         Data[1];\r
-  } Tcp;\r
-} PROTOCOL_UNION;\r
-\r
-//\r
-// out buffer structure\r
-//\r
-typedef struct {\r
-  UINT8           MediaHeader[MAX_MEDIA_HDR_SIZE];\r
-  IPV4_HEADER     IpHeader;\r
-  //\r
-  // following union placement only valid if no option IP header\r
-  //\r
-  PROTOCOL_UNION  u;\r
-} IPV4_BUFFER;\r
-\r
-typedef struct {\r
-  IPV4_HEADER     IpHeader;\r
-  //\r
-  // following union placement only valid if no option IP header\r
-  //\r
-  PROTOCOL_UNION  u;\r
-} IPV4_STRUCT;\r
-\r
-#pragma pack()  // reset to default\r
-\r
-  ////////////////////////////////////////////////////////////\r
-//\r
-//  BC IP Filter Routine\r
-//\r
-EFI_STATUS\r
-IpFilter (\r
-  PXE_BASECODE_DEVICE            *Private,\r
-  IN EFI_PXE_BASE_CODE_IP_FILTER *Filter\r
-  );\r
-\r
-//\r
-// //////////////////////////////////////////////////////////////////////\r
-//\r
-//  Udp Write Routine - called by base code - e.g. TFTP - already locked\r
-//\r
-EFI_STATUS\r
-UdpWrite (\r
-  IN PXE_BASECODE_DEVICE                      *Private,\r
-  IN UINT16                                   OpFlags,\r
-  IN EFI_IP_ADDRESS                           *DestIpPtr,\r
-  IN EFI_PXE_BASE_CODE_UDP_PORT               *DestPortptr,\r
-  IN EFI_IP_ADDRESS                           *GatewayIpPtr, OPTIONAL\r
-  IN EFI_IP_ADDRESS                           *SrcIpPtr, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT           *SrcPortPtr, OPTIONAL\r
-  IN UINTN                                    *HeaderSizePtr, OPTIONAL\r
-  IN VOID                                     *HeaderPtr, OPTIONAL\r
-  IN UINTN                                    *BufferSizePtr,\r
-  IN VOID                                     *BufferPtr\r
-  );\r
-\r
-//\r
-// /////////////////////////////////////////////////////////////////////\r
-//\r
-//  Udp Read Routine - called by base code - e.g. TFTP - already locked\r
-//\r
-EFI_STATUS\r
-UdpRead (\r
-  IN PXE_BASECODE_DEVICE            *Private,\r
-  IN UINT16                         OpFlags,\r
-  IN OUT EFI_IP_ADDRESS             *DestIpPtr, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPorPtrt, OPTIONAL\r
-  IN OUT EFI_IP_ADDRESS             *SrcIpPtr, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL\r
-  IN UINTN                          *HeaderSizePtr, OPTIONAL\r
-  IN VOID                           *HeaderPtr, OPTIONAL\r
-  IN OUT UINTN                      *BufferSizePtr,\r
-  IN VOID                           *BufferPtr,\r
-  IN EFI_EVENT                      TimeoutEvent\r
-  );\r
-\r
-VOID\r
-IgmpLeaveGroup (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  EFI_IP_ADDRESS      *\r
-  );\r
-\r
-VOID\r
-IgmpJoinGroup (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  EFI_IP_ADDRESS      *\r
-  );\r
-\r
-//\r
-// convert number to zero filled ascii value of length lth\r
-//\r
-VOID\r
-CvtNum (\r
-  UINTN Number,\r
-  UINT8 *BufferPtr,\r
-  INTN  BufferLen\r
-  );\r
-\r
-//\r
-// convert number to ascii string at ptr\r
-//\r
-VOID\r
-UtoA10 (\r
-  UINTN Number,\r
-  UINT8 *BufferPtr\r
-  );\r
-\r
-//\r
-// convert ascii numeric string to UINTN\r
-//\r
-UINTN\r
-AtoU (\r
-  UINT8 *BufferPtr\r
-  );\r
-\r
-UINT64\r
-AtoU64 (\r
-  UINT8 *BufferPtr\r
-  );\r
-\r
-//\r
-// calculate the internet checksum (RFC 1071)\r
-// return 16 bit ones complement of ones complement sum of 16 bit words\r
-//\r
-UINT16\r
-IpChecksum (\r
-  UINT16 *MessagePtr,\r
-  UINTN  ByteLength\r
-  );\r
-\r
-//\r
-// do checksum on non contiguous header and data\r
-//\r
-UINT16\r
-IpChecksum2 (\r
-  UINT16 *Header,\r
-  UINTN  HeaderLength,\r
-  UINT16 *Message,\r
-  UINTN  MessageLength\r
-  );\r
-\r
-//\r
-// update checksum when only a single word changes\r
-//\r
-UINT16\r
-UpdateChecksum (\r
-  UINT16 OldChecksum,\r
-  UINT16 OldWord,\r
-  UINT16 NewWord\r
-  );\r
-\r
-VOID\r
-SeedRandom (\r
-  IN PXE_BASECODE_DEVICE  *Private,\r
-  IN UINT16               InitialSeed\r
-  );\r
-\r
-UINT16\r
-Random (\r
-  IN PXE_BASECODE_DEVICE  *Private\r
-  );\r
-\r
-EFI_STATUS\r
-SendPacket (\r
-  PXE_BASECODE_DEVICE           *Private,\r
-  VOID                          *HeaderPtr,\r
-  VOID                          *PacketPtr,\r
-  INTN                          PacketLength,\r
-  VOID                          *HardwareAddress,\r
-  UINT16                        MediaProtocol,\r
-  IN EFI_PXE_BASE_CODE_FUNCTION Function\r
-  );\r
-\r
-VOID\r
-HandleArpReceive (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  ARP_PACKET          *ArpPacketPtr,\r
-  VOID                *HeaderPtr\r
-  );\r
-\r
-VOID\r
-HandleIgmp (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  IGMPV2_MESSAGE      *IgmpMessageptr,\r
-  UINTN               IgmpMessageLen\r
-  );\r
-\r
-VOID\r
-IgmpCheckTimers (\r
-  PXE_BASECODE_DEVICE *Private\r
-  );  // poll when doing a receive\r
-// return hw add of IP and TRUE if available, otherwise FALSE\r
-//\r
-BOOLEAN\r
-GetHwAddr (\r
-  IN PXE_BASECODE_DEVICE  *Private,\r
-  EFI_IP_ADDRESS          *ProtocolAddressPtr,\r
-  EFI_MAC_ADDRESS         *HardwareAddressPtr\r
-  );\r
-\r
-EFI_STATUS\r
-DoArp (\r
-  IN PXE_BASECODE_DEVICE  *Private,\r
-  IN EFI_IP_ADDRESS       *ProtocolAddressPtr,\r
-  OUT EFI_MAC_ADDRESS     *HardwareAddressptr\r
-  );\r
-\r
-BOOLEAN\r
-OnSameSubnet (\r
-  UINTN           IpAddressLen,\r
-  EFI_IP_ADDRESS  *Ip1,\r
-  EFI_IP_ADDRESS  *Ip2,\r
-  EFI_IP_ADDRESS  *SubnetMask\r
-  );\r
-\r
-VOID\r
-IpAddRouter (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  EFI_IP_ADDRESS      *RouterIp\r
-  );\r
-\r
-#define Ip4AddRouter(Private, Ipv4Ptr)  IpAddRouter (Private, (EFI_IP_ADDRESS *) Ipv4Ptr)\r
-\r
-//\r
-// routine to send ipv4 packet\r
-// ipv4 + upper protocol header for length TotHdrLth in xmtbuf, ipv4 header length IpHdrLth\r
-// routine fills in ipv4hdr Ver_Hdl, TotLth, and Checksum, moves in Data, and gets dest MAC address\r
-//\r
-EFI_STATUS\r
-Ipv4Xmt (\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  UINT32                      GatewayIP,\r
-  UINTN                       IpHeaderLen,\r
-  UINTN                       TotalHeaderLen,\r
-  VOID                        *Data,\r
-  UINTN                       DataLen,\r
-  EFI_PXE_BASE_CODE_FUNCTION  Function\r
-  );\r
-\r
-//\r
-// send ipv4 packet with ipv4 option\r
-//\r
-EFI_STATUS\r
-Ipv4SendWOp (\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  UINT32                      GatewayIP,\r
-  UINT8                       *MessagePtr,\r
-  UINTN                       MessageLth,\r
-  UINT8                       Protocol,\r
-  UINT8                       *Option,\r
-  UINTN                       OptionLen,\r
-  UINT32                      DestIp,\r
-  EFI_PXE_BASE_CODE_FUNCTION  Function\r
-  );\r
-\r
-//\r
-// send MsgLth message at MsgPtr - higher level protocol header already in xmtbuf, length HdrSize\r
-//\r
-EFI_STATUS\r
-Ip4Send (\r
-  IN PXE_BASECODE_DEVICE  *Private,     // pointer to instance data\r
-  IN UINTN                MayFragment,  //\r
-  IN UINT8                Protocol,     // protocol\r
-  IN UINT32               SrcIp,        // Source IP address\r
-  IN UINT32               DestIp,       // Destination IP address\r
-  IN UINT32               GatewayIp,    // used if not NULL and needed\r
-  IN UINTN                HeaderSize,   // protocol header byte length\r
-  IN UINT8                *MsgPtr,      // pointer to data\r
-  IN UINTN                MsgLength\r
-  );                                    // data byte length\r
-// receive up to MsgLth message into MsgPtr for protocol Prot\r
-// return message length, src/dest ips if select any, and pointer to protocol header\r
-//\r
-EFI_STATUS\r
-IpReceive (\r
-  IN PXE_BASECODE_DEVICE    *Private,   // pointer to instance data\r
-  UINT16                    OpFlags,    // Flags to determine if filtering on IP addresses\r
-  EFI_IP_ADDRESS            *SrcIpPtr,  // if filtering, O if accept any\r
-  EFI_IP_ADDRESS            *DstIpPtr,  // if filtering, O if accept any\r
-  UINT8                     Protocol,   // protocol\r
-  VOID                      *HeaderPtr, // address of where to put protocol header\r
-  UINTN                     HeaderSize, // protocol header byte length\r
-  UINT8                     *MsgPtr,    // pointer to data buffer\r
-  UINTN                     *MsgLenPtr, // pointer to data buffer length/ O - returned data length\r
-  IN EFI_EVENT              TimeoutEvent\r
-  );\r
-\r
-#if 0\r
-VOID\r
-WaitForTxComplete (\r
-  IN PXE_BASECODE_DEVICE    *Private\r
-  );\r
-#endif\r
-//\r
-// routine to cycle waiting for a receive or timeout\r
-//\r
-EFI_STATUS\r
-WaitForReceive (\r
-  IN PXE_BASECODE_DEVICE        *Private,\r
-  IN EFI_PXE_BASE_CODE_FUNCTION Function,\r
-  IN EFI_EVENT                  TimeoutEvent,\r
-  IN OUT UINTN                  *HeaderSizePtr,\r
-  IN OUT UINTN                  *BufferSizePtr,\r
-  IN OUT UINT16                 *ProtocolPtr\r
-  );\r
-\r
-#endif /* _IP_H_ */\r
-\r
-/* EOF - ip.h */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Ipf/PxeArch.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Ipf/PxeArch.h
deleted file mode 100644 (file)
index 866f486..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeArch.h\r
-\r
-Abstract:\r
-  Defines PXE Arch type\r
-\r
-\r
-**/\r
-\r
-#ifndef _EFI_PXE_ARCH_H_\r
-#define _EFI_PXE_ARCH_H_\r
-\r
-#define SYS_ARCH  0x2\r
-\r
-#endif\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/PxeBcDxe.inf b/MdeModulePkg/Universal/Network/PxeBcDxe/PxeBcDxe.inf
deleted file mode 100644 (file)
index 025df32..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-#/** @file\r
-# Component name for module BC\r
-#\r
-# Copyright (c) 2007, Intel Corporation\r
-#\r
-#  All rights reserved. This program and the accompanying materials\r
-#  are licensed and made available under the terms and conditions of the BSD License\r
-#  which accompanies this distribution. The full text of the license may be found at\r
-#  http://opensource.org/licenses/bsd-license.php\r
-#\r
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-#\r
-#\r
-#**/\r
-\r
-[Defines]\r
-  INF_VERSION                    = 0x00010005\r
-  BASE_NAME                      = PxeBcDxe\r
-  FILE_GUID                      = A3f436EA-A127-4EF8-957C-8048606FF670\r
-  MODULE_TYPE                    = UEFI_DRIVER\r
-  VERSION_STRING                 = 1.0\r
-  ENTRY_POINT                    = InitializeBCDriver\r
-\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
-#\r
-#  DRIVER_BINDING                =  mPxeBcDriverBinding                        \r
-#  COMPONENT_NAME                =  gPxeBcComponentName\r
-#  COMPONENT_NAME2               =  gPxeBcComponentName2\r
-#\r
-\r
-[Sources.common]\r
-  Pxe_bc_mtftp.c\r
-  Bc.c\r
-  Dhcp.h\r
-  Ip.h\r
-  Pxe_bc_ip.c\r
-  Pxe_bc_dhcp.c\r
-  Pxe_bc_arp.c\r
-  Hton.h\r
-  ComponentName.c\r
-  Bc.h\r
-  Pxe_loadfile.c\r
-  Tftp.h\r
-  Pxe_bc_igmp.c\r
-  Pxe_bc_udp.c\r
-\r
-[Sources.IA32]\r
-  Ia32/PxeArch.h\r
-\r
-[Sources.X64]\r
-  X64/PxeArch.h\r
-\r
-[Sources.IPF]\r
-  Ipf/PxeArch.h\r
-\r
-[Sources.EBC]\r
-  Ebc/PxeArch.h\r
-  Ebc/PxeArch.c\r
-\r
-\r
-[Packages]\r
-  MdePkg/MdePkg.dec\r
-  MdeModulePkg/MdeModulePkg.dec\r
-\r
-\r
-[LibraryClasses]\r
-  UefiLib\r
-  BaseLib\r
-  UefiBootServicesTableLib\r
-  UefiDriverEntryPoint\r
-  BaseMemoryLib\r
-  DebugLib\r
-\r
-\r
-[Guids]\r
-  gEfiSmbiosTableGuid                           # ALWAYS_CONSUMED\r
-\r
-\r
-[Protocols]\r
-  gEfiBisProtocolGuid                             # PROTOCOL ALWAYS_CONSUMED\r
-  gEfiPxeBaseCodeCallbackProtocolGuid             # PROTOCOL ALWAYS_PRODUCED\r
-  gEfiPxeBaseCodeProtocolGuid                     # PROTOCOL ALWAYS_PRODUCED\r
-  gEfiLoadFileProtocolGuid                        # PROTOCOL ALWAYS_CONSUMED\r
-  gEfiSimpleNetworkProtocolGuid                   # PROTOCOL ALWAYS_CONSUMED\r
-  gEfiDevicePathProtocolGuid                      # PROTOCOL ALWAYS_CONSUMED\r
-  gEfiTcpProtocolGuid                             # PROTOCOL ALWAYS_CONSUMED\r
-  gEfiNetworkInterfaceIdentifierProtocolGuid_31   # PROTOCOL ALWAYS_CONSUMED\r
-  gEfiLoadedImageProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED\r
-\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_arp.c b/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_arp.c
deleted file mode 100644 (file)
index 45956b1..0000000
+++ /dev/null
@@ -1,582 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  pxe_bc_arp.c\r
-\r
-Abstract:\r
-\r
-\r
-**/\r
-\r
-#include "Bc.h"\r
-\r
-//\r
-// Definitions for ARP\r
-// Per RFC 826\r
-//\r
-ARP_HEADER ArpHeader;\r
-\r
-#pragma pack(1)\r
-struct {\r
-  UINT8       MediaHeader[14];\r
-  ARP_HEADER  ArpHeader;\r
-  UINT8       ArpData[64];\r
-} ArpReplyPacket;\r
-#pragma pack()\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return none\r
-\r
-**/\r
-VOID\r
-InitArpHeader (\r
-  VOID\r
-  )\r
-{\r
-  ArpHeader.HwType      = HTONS (ETHERNET_ADD_SPC);\r
-  ArpHeader.ProtType    = HTONS (ETHER_TYPE_IP);\r
-  ArpHeader.HwAddLen    = ENET_HWADDLEN;\r
-  ArpHeader.ProtAddLen  = IPV4_PROTADDLEN;\r
-  ArpHeader.OpCode      = HTONS (ARP_REQUEST);\r
-\r
-  CopyMem (&ArpReplyPacket.ArpHeader, &ArpHeader, sizeof (ARP_HEADER));\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-VOID\r
-HandleArpReceive (\r
-  IN PXE_BASECODE_DEVICE  *Private,\r
-  IN ARP_PACKET           *ArpPacketPtr,\r
-  IN VOID                 *MediaHeader\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxeBcMode;\r
-  EFI_SIMPLE_NETWORK_MODE *SnpMode;\r
-  EFI_MAC_ADDRESS         TmpMacAddr;\r
-  UINTN                   Index;\r
-  UINT8                   *SrcHwAddr;\r
-  UINT8                   *SrcPrAddr;\r
-  UINT8                   *DstHwAddr;\r
-  UINT8                   *DstPrAddr;\r
-  UINT8                   *TmpPtr;\r
-\r
-  //\r
-  //\r
-  //\r
-  PxeBcMode = Private->EfiBc.Mode;\r
-  SnpMode   = Private->SimpleNetwork->Mode;\r
-\r
-  //\r
-  // For now only ethernet addresses are supported.\r
-  // This will need to be updated when other media\r
-  // layers are supported by PxeBc, Snp and UNDI.\r
-  //\r
-  if (ArpPacketPtr->ArpHeader.HwType != HTONS (ETHERNET_ADD_SPC)) {\r
-    return ;\r
-  }\r
-  //\r
-  // For now only IP protocol addresses are supported.\r
-  // This will need to be updated when other protocol\r
-  // types are supported by PxeBc, Snp and UNDI.\r
-  //\r
-  if (ArpPacketPtr->ArpHeader.ProtType != HTONS (ETHER_TYPE_IP)) {\r
-    return ;\r
-  }\r
-  //\r
-  // For now only SNP hardware address sizes are supported.\r
-  //\r
-  if (ArpPacketPtr->ArpHeader.HwAddLen != SnpMode->HwAddressSize) {\r
-    return ;\r
-  }\r
-  //\r
-  // For now only PxeBc protocol address sizes are supported.\r
-  //\r
-  if (ArpPacketPtr->ArpHeader.ProtAddLen != Private->IpLength) {\r
-    return ;\r
-  }\r
-  //\r
-  // Ignore out of range opcodes\r
-  //\r
-  switch (ArpPacketPtr->ArpHeader.OpCode) {\r
-  case HTONS (ARP_REPLY):\r
-  case HTONS (ARP_REQUEST):\r
-    break;\r
-\r
-  default:\r
-    return ;\r
-  }\r
-  //\r
-  // update entry in our ARP cache if we have it\r
-  //\r
-  SrcHwAddr = (UINT8 *) &ArpPacketPtr->SrcHardwareAddr;\r
-  SrcPrAddr = SrcHwAddr + SnpMode->HwAddressSize;\r
-\r
-  for (Index = 0; Index < PxeBcMode->ArpCacheEntries; ++Index) {\r
-    if (CompareMem (\r
-          &PxeBcMode->ArpCache[Index].IpAddr,\r
-          SrcPrAddr,\r
-          Private->IpLength\r
-          )) {\r
-      continue;\r
-    }\r
-\r
-    CopyMem (\r
-      &PxeBcMode->ArpCache[Index].MacAddr,\r
-      SrcHwAddr,\r
-      SnpMode->HwAddressSize\r
-      );\r
-\r
-    break;\r
-  }\r
-  //\r
-  // Done if ARP packet was not for us.\r
-  //\r
-  DstHwAddr = SrcPrAddr + Private->IpLength;\r
-  DstPrAddr = DstHwAddr + SnpMode->HwAddressSize;\r
-\r
-  if (CompareMem (DstPrAddr, &PxeBcMode->StationIp, Private->IpLength)) {\r
-    return ;\r
-    //\r
-    // not for us\r
-    //\r
-  }\r
-  //\r
-  // for us - if we did not update entry, add it\r
-  //\r
-  if (Index == PxeBcMode->ArpCacheEntries) {\r
-    //\r
-    // if we have a full table, get rid of oldest\r
-    //\r
-    if (Index == PXE_ARP_CACHE_SIZE) {\r
-      Index = Private->OldestArpEntry;\r
-\r
-      if (++Private->OldestArpEntry == PXE_ARP_CACHE_SIZE) {\r
-        Private->OldestArpEntry = 0;\r
-      }\r
-    } else {\r
-      ++PxeBcMode->ArpCacheEntries;\r
-    }\r
-\r
-    CopyMem (\r
-      &PxeBcMode->ArpCache[Index].MacAddr,\r
-      SrcHwAddr,\r
-      SnpMode->HwAddressSize\r
-      );\r
-\r
-    CopyMem (\r
-      &PxeBcMode->ArpCache[Index].IpAddr,\r
-      SrcPrAddr,\r
-      Private->IpLength\r
-      );\r
-  }\r
-  //\r
-  // if this is not a request or we don't yet have an IP, finished\r
-  //\r
-  if (ArpPacketPtr->ArpHeader.OpCode != HTONS (ARP_REQUEST) || !Private->GoodStationIp) {\r
-    return ;\r
-  }\r
-  //\r
-  // Assemble ARP reply.\r
-  //\r
-  //\r
-  // Create media header.  [ dest mac | src mac | prot ]\r
-  //\r
-  CopyMem (\r
-    &ArpReplyPacket.MediaHeader[0],\r
-    SrcHwAddr,\r
-    SnpMode->HwAddressSize\r
-    );\r
-\r
-  CopyMem (\r
-    &ArpReplyPacket.MediaHeader[SnpMode->HwAddressSize],\r
-    &SnpMode->CurrentAddress,\r
-    SnpMode->HwAddressSize\r
-    );\r
-\r
-  CopyMem (\r
-    &ArpReplyPacket.MediaHeader[2 * SnpMode->HwAddressSize],\r
-    &((UINT8 *) MediaHeader)[2 * SnpMode->HwAddressSize],\r
-    sizeof (UINT16)\r
-    );\r
-\r
-  //\r
-  // ARP reply header is almost filled in,\r
-  // just insert the correct opcode.\r
-  //\r
-  ArpReplyPacket.ArpHeader.OpCode = HTONS (ARP_REPLY);\r
-\r
-  //\r
-  // Now fill in ARP data.  [ src mac | src prot | dest mac | dest prot ]\r
-  //\r
-  TmpPtr = ArpReplyPacket.ArpData;\r
-  CopyMem (TmpPtr, &SnpMode->CurrentAddress, SnpMode->HwAddressSize);\r
-\r
-  TmpPtr += SnpMode->HwAddressSize;\r
-  CopyMem (TmpPtr, &PxeBcMode->StationIp, Private->IpLength);\r
-\r
-  TmpPtr += Private->IpLength;\r
-  CopyMem (TmpPtr, SrcHwAddr, SnpMode->HwAddressSize);\r
-\r
-  TmpPtr += SnpMode->HwAddressSize;\r
-  CopyMem (TmpPtr, SrcPrAddr, Private->IpLength);\r
-\r
-  //\r
-  // Now send out the ARP reply.\r
-  //\r
-  CopyMem (&TmpMacAddr, SrcHwAddr, sizeof (EFI_MAC_ADDRESS));\r
-\r
-  SendPacket (\r
-    Private,\r
-    &ArpReplyPacket.MediaHeader,\r
-    &ArpReplyPacket.ArpHeader,\r
-    sizeof (ARP_HEADER) + 2 * (Private->IpLength + SnpMode->HwAddressSize),\r
-    &TmpMacAddr,\r
-    PXE_PROTOCOL_ETHERNET_ARP,\r
-    EFI_PXE_BASE_CODE_FUNCTION_ARP\r
-    );\r
-\r
-  //\r
-  // Give time (100 microseconds) for ARP reply to get onto wire.\r
-  //\r
-  gBS->Stall (1000);\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return TRUE := If IP address was found and MAC address was stored\r
-  @return FALSE := If IP address was not found\r
-\r
-**/\r
-BOOLEAN\r
-GetHwAddr (\r
-  IN PXE_BASECODE_DEVICE  *Private,\r
-  IN EFI_IP_ADDRESS       *ProtocolAddrPtr,\r
-  OUT EFI_MAC_ADDRESS     *HardwareAddrPtr\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxeBcMode;\r
-  UINTN                   HardwareAddrLength;\r
-  UINTN                   Index;\r
-\r
-  PxeBcMode           = Private->EfiBc.Mode;\r
-  HardwareAddrLength  = Private->SimpleNetwork->Mode->HwAddressSize;\r
-\r
-  for (Index = 0; Index < PxeBcMode->ArpCacheEntries; ++Index) {\r
-    if (!CompareMem (\r
-          ProtocolAddrPtr,\r
-          &PxeBcMode->ArpCache[Index].IpAddr,\r
-          Private->IpLength\r
-          )) {\r
-      CopyMem (\r
-        HardwareAddrPtr,\r
-        &PxeBcMode->ArpCache[Index].MacAddr,\r
-        HardwareAddrLength\r
-        );\r
-\r
-      return TRUE;\r
-    }\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return EFI_SUCCESS := ARP request sent\r
-  @return other := ARP request could not be sent\r
-\r
-**/\r
-EFI_STATUS\r
-SendRequest (\r
-  IN PXE_BASECODE_DEVICE  *Private,\r
-  IN EFI_IP_ADDRESS       *ProtocolAddrPtr,\r
-  IN EFI_MAC_ADDRESS      *HardwareAddrPtr\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxeBcMode;\r
-  EFI_SIMPLE_NETWORK_MODE *SnpMode;\r
-  ARP_PACKET              *ArpPacket;\r
-  EFI_STATUS              Status;\r
-  UINTN                   HardwareAddrLength;\r
-  UINT8                   *SrcProtocolAddrPtr;\r
-  UINT8                   *DestHardwareAddrptr;\r
-  UINT8                   *DestProtocolAddrPtr;\r
-\r
-  //\r
-  //\r
-  //\r
-  PxeBcMode           = Private->EfiBc.Mode;\r
-  SnpMode             = Private->SimpleNetwork->Mode;\r
-  HardwareAddrLength  = SnpMode->HwAddressSize;\r
-\r
-  //\r
-  // Allocate ARP buffer\r
-  //\r
-  if (Private->ArpBuffer == NULL) {\r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    SnpMode->MediaHeaderSize + sizeof (ARP_PACKET),\r
-                    (VOID **) &Private->ArpBuffer\r
-                    );\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-\r
-  ArpPacket = (VOID *) (Private->ArpBuffer + SnpMode->MediaHeaderSize);\r
-\r
-  //\r
-  // for now, only handle one kind of hw and pr address\r
-  //\r
-  ArpPacket->ArpHeader            = ArpHeader;\r
-  ArpPacket->ArpHeader.HwAddLen   = (UINT8) HardwareAddrLength;\r
-  ArpPacket->ArpHeader.ProtAddLen = (UINT8) Private->IpLength;\r
-\r
-  //\r
-  // rest more generic\r
-  //\r
-  SrcProtocolAddrPtr  = (UINT8 *) (&ArpPacket->SrcHardwareAddr) + HardwareAddrLength;\r
-  DestHardwareAddrptr = SrcProtocolAddrPtr + Private->IpLength;\r
-  DestProtocolAddrPtr = DestHardwareAddrptr + HardwareAddrLength;\r
-\r
-  CopyMem (DestProtocolAddrPtr, ProtocolAddrPtr, Private->IpLength);\r
-  CopyMem (DestHardwareAddrptr, HardwareAddrPtr, HardwareAddrLength);\r
-  CopyMem (SrcProtocolAddrPtr, &PxeBcMode->StationIp, Private->IpLength);\r
-  CopyMem (\r
-    &ArpPacket->SrcHardwareAddr,\r
-    &SnpMode->CurrentAddress,\r
-    HardwareAddrLength\r
-    );\r
-\r
-  return SendPacket (\r
-          Private,\r
-          Private->ArpBuffer,\r
-          ArpPacket,\r
-          sizeof (ARP_HEADER) + ((Private->IpLength + HardwareAddrLength) << 1),\r
-          &SnpMode->BroadcastAddress,\r
-          PXE_PROTOCOL_ETHERNET_ARP,\r
-          EFI_PXE_BASE_CODE_FUNCTION_ARP\r
-          );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// check for address - if not there, send ARP request, wait and check again\r
-// not how it would be done in a full system\r
-//\r
-#define ARP_REQUEST_TIMEOUT_MS  500 // try for half a second\r
-\r
-  ////////////////////////////////////////////////////////////\r
-//\r
-//  BC Arp Routine\r
-//\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcArp (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL * This,\r
-  IN EFI_IP_ADDRESS             * ProtocolAddrPtr,\r
-  OUT EFI_MAC_ADDRESS           * HardwareAddrPtr OPTIONAL\r
-  )\r
-{\r
-  EFI_MAC_ADDRESS     Mac;\r
-  EFI_STATUS          StatCode;\r
-  PXE_BASECODE_DEVICE *Private;\r
-\r
-  //\r
-  // Lock the instance data and make sure started\r
-  //\r
-  StatCode = EFI_SUCCESS;\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE poiner == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  if (This->Mode == NULL || !This->Mode->Started) {\r
-    DEBUG ((DEBUG_ERROR, "BC was not started."));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  DEBUG ((DEBUG_INFO, "\nBcArp()"));\r
-\r
-  //\r
-  // Issue BC command\r
-  //\r
-  if (ProtocolAddrPtr == NULL) {\r
-    DEBUG (\r
-      (DEBUG_INFO,\r
-      "\nBcArp()  Exit #1  %Xh (%r)",\r
-      EFI_INVALID_PARAMETER,\r
-      EFI_INVALID_PARAMETER)\r
-      );\r
-\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (HardwareAddrPtr == NULL) {\r
-    HardwareAddrPtr = &Mac;\r
-  }\r
-\r
-  ZeroMem (HardwareAddrPtr, Private->SimpleNetwork->Mode->HwAddressSize);\r
-\r
-  if (GetHwAddr (Private, ProtocolAddrPtr, HardwareAddrPtr)) {\r
-    DEBUG (\r
-      (DEBUG_INFO,\r
-      "\nBcArp()  Exit #2  %Xh (%r)",\r
-      EFI_SUCCESS,\r
-      EFI_SUCCESS)\r
-      );\r
-\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  StatCode = DoArp (Private, ProtocolAddrPtr, HardwareAddrPtr);\r
-\r
-  DEBUG ((DEBUG_INFO, "\nBcArp()  Exit #3  %Xh (%r)", StatCode, StatCode));\r
-\r
-  EfiReleaseLock (&Private->Lock);\r
-  return StatCode;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return EFI_SUCCESS := MAC address found\r
-  @return other := MAC address could not be found\r
-\r
-**/\r
-EFI_STATUS\r
-DoArp (\r
-  IN PXE_BASECODE_DEVICE  *Private,\r
-  IN EFI_IP_ADDRESS       *ProtocolAddrPtr,\r
-  OUT EFI_MAC_ADDRESS     *HardwareAddrPtr\r
-  )\r
-{\r
-  EFI_STATUS  StatCode;\r
-  EFI_EVENT   TimeoutEvent;\r
-  UINTN       HeaderSize;\r
-  UINTN       BufferSize;\r
-  UINT16      Protocol;\r
-\r
-  DEBUG ((DEBUG_INFO, "\nDoArp()"));\r
-\r
-  //\r
-  //\r
-  //\r
-  StatCode = SendRequest (Private, ProtocolAddrPtr, HardwareAddrPtr);\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    DEBUG ((DEBUG_INFO, "\nDoArp()  Exit #1  %Xh (%r)", StatCode, StatCode));\r
-    return StatCode;\r
-  }\r
-  //\r
-  //\r
-  //\r
-  StatCode = gBS->CreateEvent (\r
-                    EVT_TIMER,\r
-                    TPL_CALLBACK,\r
-                    NULL,\r
-                    NULL,\r
-                    &TimeoutEvent\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    return StatCode;\r
-  }\r
-\r
-  StatCode = gBS->SetTimer (\r
-                    TimeoutEvent,\r
-                    TimerRelative,\r
-                    ARP_REQUEST_TIMEOUT_MS * 10000\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return StatCode;\r
-  }\r
-  //\r
-  //\r
-  //\r
-  for (;;) {\r
-    StatCode = WaitForReceive (\r
-                Private,\r
-                EFI_PXE_BASE_CODE_FUNCTION_ARP,\r
-                TimeoutEvent,\r
-                &HeaderSize,\r
-                &BufferSize,\r
-                &Protocol\r
-                );\r
-\r
-    if (EFI_ERROR (StatCode)) {\r
-      break;\r
-    }\r
-\r
-    if (Protocol != PXE_PROTOCOL_ETHERNET_ARP) {\r
-      continue;\r
-    }\r
-\r
-    HandleArpReceive (\r
-      Private,\r
-      (ARP_PACKET *) (Private->ReceiveBufferPtr + HeaderSize),\r
-      Private->ReceiveBufferPtr\r
-      );\r
-\r
-    if (GetHwAddr (Private, ProtocolAddrPtr, HardwareAddrPtr)) {\r
-      break;\r
-    }\r
-  }\r
-\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nDoArp()  Exit #2  %Xh, (%r)",\r
-    StatCode,\r
-    StatCode)\r
-    );\r
-\r
-  gBS->CloseEvent (TimeoutEvent);\r
-\r
-  return StatCode;\r
-}\r
-\r
-/* eof - pxe_bc_arp.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_dhcp.c b/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_dhcp.c
deleted file mode 100644 (file)
index 7d8518a..0000000
+++ /dev/null
@@ -1,3258 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  pxe_bc_dhcp.c\r
-\r
-Abstract:\r
-  DHCP and PXE discovery protocol implementations.\r
-\r
-\r
-**/\r
-\r
-#include "Bc.h"\r
-\r
-#include "PxeArch.h"\r
-\r
-EFI_PXE_BASE_CODE_UDP_PORT DhcpServerPort        = DHCP_SERVER_PORT;\r
-EFI_PXE_BASE_CODE_UDP_PORT DHCPClientPort        = DHCP_CLIENT_PORT;\r
-EFI_PXE_BASE_CODE_UDP_PORT PseudoDhcpServerPort  = PXE_DISCOVERY_PORT;\r
-#define PSEUDO_DHCP_CLIENT_PORT PseudoDhcpServerPort\r
-EFI_IP_ADDRESS             BroadcastIP       = {{0xffffffff}};\r
-EFI_IP_ADDRESS             DefaultSubnetMask = {{0xffffff00}};\r
-\r
-typedef union {\r
-  DHCPV4_OP_STRUCT          *OpPtr;\r
-  PXE_OP_SERVER_LIST        *BootServersStr;\r
-  PXE_SERVER_LIST           *BootServerList;\r
-  PXE_BOOT_MENU_ENTRY       *BootMenuItem;\r
-  PXE_OP_DISCOVERY_CONTROL  *DiscoveryControl;\r
-  PXE_OP_BOOT_MENU          *BootMenu;\r
-  PXE_OP_BOOT_ITEM          *BootItem;\r
-  DHCPV4_OP_VENDOR_OPTIONS  *VendorOptions;\r
-  DHCPV4_OP_OVERLOAD        *Overload;\r
-  DHCPV4_OP_CLASS           *PxeClassStr;\r
-  DHCPV4_OP_SUBNET_MASK     *SubnetMaskStr;\r
-  DHCPV4_OP_MESSAGE_TYPE    *MessageType;\r
-  UINT8                     *BytePtr;\r
-} UNION_PTR;\r
-\r
-#pragma pack(1)\r
-//\r
-// option structure for DHCPREQUEST at end of DISCOVER options\r
-// and for DHCPDECLINE\r
-//\r
-const struct requestopendstr {\r
-  DHCPV4_OP_REQUESTED_IP  OpReqIP;\r
-  DHCPV4_OP_SERVER_IP     DhcServerIpPtr;\r
-  UINT8                   End[1];\r
-}\r
-RequestOpEndStr = {\r
-  {\r
-    {\r
-      OP_DHCP_REQ_IP_ADD,\r
-      DHCPV4_OPTION_LENGTH(DHCPV4_OP_REQUESTED_IP)\r
-    }\r
-  },\r
-  {\r
-    {\r
-      OP_DHCP_SERVER_IP,\r
-      DHCPV4_OPTION_LENGTH(DHCPV4_OP_SERVER_IP)\r
-    }\r
-  },\r
-  {\r
-    OP_END\r
-  }\r
-};\r
-\r
-#define DHCP_REQ_OPTIONS  (*(struct requestopendstr *) DHCPV4_OPTIONS_BUFFER.End)\r
-\r
-PXE_OP_BOOT_ITEM                DefaultBootItem = {\r
-  {\r
-    VEND_PXE_BOOT_ITEM,\r
-    DHCPV4_OPTION_LENGTH(PXE_OP_BOOT_ITEM)\r
-  },\r
-  0,\r
-  0\r
-};\r
-\r
-//\r
-// PXE discovery control default structure\r
-//\r
-PXE_OP_DISCOVERY_CONTROL DefaultDisCtl = {\r
-  { VEND_PXE_DISCOVERY_CONTROL, DHCPV4_OPTION_LENGTH(PXE_OP_DISCOVERY_CONTROL) },\r
-  0\r
-};\r
-\r
-//\r
-// PXE credentials option structure\r
-//\r
-typedef struct {\r
-  UINT8 c[4];\r
-} PXE_CREDENTIAL;\r
-\r
-typedef struct {\r
-  DHCPV4_OP_HEADER  Header;\r
-  PXE_CREDENTIAL    Credentials[1];\r
-} PXE_OP_CREDENTIAL_TYPES;\r
-\r
-//\r
-// option structure for PXE discover (without credentials)\r
-//\r
-typedef struct {            // discoveropendstr {\r
-  DHCPV4_OP_HEADER  Header; // vendor options\r
-  PXE_OP_BOOT_ITEM  BootItem;\r
-  UINT8             End[1]; // if credentials option, it starts here\r
-} PXE_DISCOVER_OPTIONS;\r
-\r
-#define DISCOVERoptions (*(PXE_DISCOVER_OPTIONS *) DHCPV4_OPTIONS_BUFFER.End)\r
-#define DISCREDoptions  (*(PXE_OP_CREDENTIAL_TYPES *) DISCOVERoptions.End)\r
-\r
-//\r
-// common option beginning for all our DHCP messages except\r
-// DHCPDECLINE and DHCPRELEASE\r
-//\r
-struct optionsstr {\r
-  UINT8                       DhcpCookie[4];\r
-  DHCPV4_OP_MESSAGE_TYPE      DhcpMessageType;\r
-  DHCPV4_OP_MAX_MESSAGE_SIZE  DhcpMaxMessageSize;\r
-  DHCPV4_OP_REQUESTED_OPTIONS DhcpRequestedOptions;\r
-  DHCPV4_OP_PLATFORM_ID       DhcpPlatformId;\r
-  DHCPV4_OP_NETWORK_INTERFACE DhcpNetworkInterface;\r
-  DHCPV4_OP_ARCHITECTURE_TYPE DhcpClientArchitecture;\r
-  DHCPV4_OP_CLASS_ID          DhcpClassIdentifier;\r
-  UINT8                       End[1];\r
-} DHCPOpStart;\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-OptionsStrucInit (\r
-  VOID\r
-  )\r
-{\r
-  DHCPOpStart.DhcpCookie[0] = 99;\r
-  DHCPOpStart.DhcpCookie[1] = 130;\r
-  DHCPOpStart.DhcpCookie[2] = 83;\r
-  DHCPOpStart.DhcpCookie[3] = 99;\r
-  DHCPOpStart.DhcpMessageType.Header.OpCode = OP_DHCP_MESSAGE_TYPE;\r
-  DHCPOpStart.DhcpMessageType.Header.Length = 1;\r
-  DHCPOpStart.DhcpMessageType.Type = DHCPDISCOVER;\r
-  DHCPOpStart.DhcpMaxMessageSize.Header.OpCode = OP_DHCP_MAX_MESSAGE_SZ;\r
-  DHCPOpStart.DhcpMaxMessageSize.Header.Length = 2;\r
-  DHCPOpStart.DhcpMaxMessageSize.MaxSize[0] = MAX_DHCP_MSG_SZ >> 8;\r
-  DHCPOpStart.DhcpMaxMessageSize.MaxSize[1] = MAX_DHCP_MSG_SZ & 0xff;\r
-  DHCPOpStart.DhcpRequestedOptions.Header.OpCode = OP_DHCP_PARM_REQ_LIST;\r
-  DHCPOpStart.DhcpRequestedOptions.Header.Length = sizeof (DHCPV4_REQUESTED_OPTIONS_DATA);\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_SUBNET_MASK = OP_SUBNET_MASK;                     /* 1 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_TIME_OFFSET = OP_TIME_OFFSET;                     /* 2 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_ROUTER_LIST = OP_ROUTER_LIST;                     /* 3 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_TIME_SERVERS = OP_TIME_SERVERS;                   /* 4 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_NAME_SERVERS = OP_NAME_SERVERS;                   /* 5 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DNS_SERVERS = OP_DNS_SERVERS;                     /* 6 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_HOST_NAME = OP_HOST_NAME;                         /* 12 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_BOOT_FILE_SZ = OP_BOOT_FILE_SZ;                   /* 13 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DOMAIN_NAME = OP_DOMAIN_NAME;                     /* 15 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_ROOT_PATH = OP_ROOT_PATH;                         /* 17 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_EXTENSION_PATH = OP_EXTENSION_PATH;               /* 18 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_MAX_DATAGRAM_SZ = OP_MAX_DATAGRAM_SZ;             /* 22 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DEFAULT_TTL = OP_DEFAULT_TTL;                     /* 23 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_BROADCAST_ADD = OP_BROADCAST_ADD;                 /* 28 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_NIS_DOMAIN_NAME = OP_NIS_DOMAIN_NAME;             /* 40 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_NIS_SERVERS = OP_NIS_SERVERS;                     /* 41 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_NTP_SERVERS = OP_NTP_SERVERS;                     /* 42 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_VENDOR_SPECIFIC = OP_VENDOR_SPECIFIC;             /* 43 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DHCP_REQ_IP_ADD = OP_DHCP_REQ_IP_ADD;             /* 50 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DHCP_LEASE_TIME = OP_DHCP_LEASE_TIME;             /* 51 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DHCP_SERVER_IP = OP_DHCP_SERVER_IP;               /* 54 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DHCP_RENEWAL_TIME = OP_DHCP_RENEWAL_TIME;         /* 58 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DHCP_REBINDING_TIME = OP_DHCP_REBINDING_TIME;     /* 59 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DHCP_CLASS_IDENTIFIER = OP_DHCP_CLASS_IDENTIFIER; /* 60 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DHCP_TFTP_SERVER_NAME = OP_DHCP_TFTP_SERVER_NAME; /* 66 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DHCP_BOOTFILE = OP_DHCP_BOOTFILE;                 /* 67 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data._OP_DHCP_PLATFORM_ID = OP_DHCP_PLATFORM_ID;           /* 97 */\r
-  DHCPOpStart.DhcpRequestedOptions.Data.VendorOption128 = 128;\r
-  DHCPOpStart.DhcpRequestedOptions.Data.VendorOption129 = 129;\r
-  DHCPOpStart.DhcpRequestedOptions.Data.VendorOption130 = 130;\r
-  DHCPOpStart.DhcpRequestedOptions.Data.VendorOption131 = 131;\r
-  DHCPOpStart.DhcpRequestedOptions.Data.VendorOption132 = 132;\r
-  DHCPOpStart.DhcpRequestedOptions.Data.VendorOption133 = 133, DHCPOpStart.DhcpRequestedOptions.Data.VendorOption134 = 134;\r
-  DHCPOpStart.DhcpRequestedOptions.Data.VendorOption135 = 135;\r
-  DHCPOpStart.DhcpPlatformId.Header.OpCode              = OP_DHCP_PLATFORM_ID;\r
-  DHCPOpStart.DhcpPlatformId.Header.Length              = DHCPV4_OPTION_LENGTH (DHCPV4_OP_PLATFORM_ID);\r
-  DHCPOpStart.DhcpNetworkInterface.Header.OpCode        = OP_DHCP_NETWORK_ARCH;\r
-  DHCPOpStart.DhcpNetworkInterface.Header.Length        = DHCPV4_OPTION_LENGTH (DHCPV4_OP_NETWORK_INTERFACE);\r
-  DHCPOpStart.DhcpNetworkInterface.Type                 = 0;\r
-  DHCPOpStart.DhcpNetworkInterface.MajorVersion         = 0;\r
-  DHCPOpStart.DhcpNetworkInterface.MinorVersion         = 0;\r
-  DHCPOpStart.DhcpClientArchitecture.Header.OpCode      = OP_DHCP_SYSTEM_ARCH;\r
-  DHCPOpStart.DhcpClientArchitecture.Header.Length      = DHCPV4_OPTION_LENGTH (DHCPV4_OP_ARCHITECTURE_TYPE);\r
-  DHCPOpStart.DhcpClientArchitecture.Type               = HTONS (SYS_ARCH);\r
-  DHCPOpStart.DhcpClassIdentifier.Header.OpCode         = OP_DHCP_CLASS_IDENTIFIER;\r
-  DHCPOpStart.DhcpClassIdentifier.Header.Length         = sizeof (DHCPV4_CLASS_ID_DATA);\r
-  CopyMem (\r
-    DHCPOpStart.DhcpClassIdentifier.Data.ClassIdentifier,\r
-    "PXEClient:",\r
-    sizeof ("PXEClient:")\r
-    );\r
-  CopyMem (DHCPOpStart.DhcpClassIdentifier.Data.Lit2, "Arch:", sizeof ("Arch:"));\r
-  CopyMem (\r
-    DHCPOpStart.DhcpClassIdentifier.Data.ArchitectureType,\r
-    "xxxxx",\r
-    sizeof ("xxxxx")\r
-    );\r
-  CopyMem (DHCPOpStart.DhcpClassIdentifier.Data.Lit3, ":", sizeof (":"));\r
-  CopyMem (DHCPOpStart.DhcpClassIdentifier.Data.InterfaceName, "XXXX", sizeof ("XXXX"));\r
-  CopyMem (DHCPOpStart.DhcpClassIdentifier.Data.Lit4, ":", sizeof (":"));\r
-  CopyMem (DHCPOpStart.DhcpClassIdentifier.Data.UndiMajor, "yyy", sizeof ("yyy"));\r
-  CopyMem (DHCPOpStart.DhcpClassIdentifier.Data.UndiMinor, "xxx", sizeof ("xxx"));\r
-  DHCPOpStart.End[0] = OP_END;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// DHCPDECLINE option structure\r
-//\r
-struct opdeclinestr {\r
-  UINT8                   DhcpCookie[4];\r
-  DHCPV4_OP_MESSAGE_TYPE  DhcpMessageType;\r
-  struct requestopendstr  OpDeclineEnd;\r
-};\r
-\r
-#define DHCPDECLINEoptions  (*(struct opdeclinestr *) DHCPV4_TRANSMIT_BUFFER.options)\r
-\r
-//\r
-// DHCPRELEASE option structure\r
-//\r
-struct opreleasestr {\r
-  UINT8                   DhcpCookie[4];\r
-  DHCPV4_OP_MESSAGE_TYPE  DhcpMessageType;\r
-  DHCPV4_OP_SERVER_IP     DhcServerIpPtr;\r
-  UINT8                   End[1];\r
-};\r
-\r
-#define DHCPRELEASEoptions  (*(struct opreleasestr *) DHCPV4_TRANSMIT_BUFFER.options)\r
-\r
-//\r
-// array of PXE vendor options in which we are interested\r
-// value 0 -> not of interest, else value is index into PXE OPTION array\r
-// option values from 1 to MAX_OUR_PXE_OPT\r
-//\r
-UINT8  ourPXEopts[MAX_OUR_PXE_OPT] = {\r
-  VEND_PXE_MTFTP_IP_IX,             // multicast IP address of bootfile for MTFTP listen\r
-  VEND_PXE_MTFTP_CPORT_IX,          // UDP Port to monitor for MTFTP responses - Intel order\r
-  VEND_PXE_MTFTP_SPORT_IX,          // Server UDP Port for MTFTP open - Intel order\r
-  VEND_PXE_MTFTP_TMOUT_IX,          // Listen timeout - secs\r
-  VEND_PXE_MTFTP_DELAY_IX,          // Transmission timeout - secs\r
-  VEND_PXE_DISCOVERY_CONTROL_IX,    // bit field\r
-  VEND_PXE_DISCOVERY_MCAST_ADDR_IX, // boot server discovery multicast address\r
-  VEND_PXE_BOOT_SERVERS_IX,         // list of boot servers of form tp(2) cnt(1) ips[cnt]\r
-  VEND_PXE_BOOT_MENU_IX,\r
-  VEND_PXE_BOOT_PROMPT_IX,\r
-  VEND_PXE_MCAST_ADDRS_ALLOC_IX,    // not used by client\r
-  VEND_PXE_CREDENTIAL_TYPES_IX,\r
-  VEND_13_IX,                       // not used by client\r
-  VEND_14_IX,                       // not used by client\r
-  VEND_15_IX,                       // not used by client\r
-  VEND_16_IX,                       // not used by client\r
-  VEND_17_IX,                       // not used by client\r
-  VEND_18_IX,                       // not used by client\r
-  VEND_19_IX,                       // not used by client\r
-  VEND_20_IX,                       // not used by client\r
-  VEND_21_IX,                       // not used by client\r
-  VEND_22_IX,                       // not used by client\r
-  VEND_23_IX,                       // not used by client\r
-  VEND_24_IX,                       // not used by client\r
-  VEND_25_IX,                       // not used by client\r
-  VEND_26_IX,                       // not used by client\r
-  VEND_27_IX,                       // not used by client\r
-  VEND_28_IX,                       // not used by client\r
-  VEND_29_IX,                       // not used by client\r
-  VEND_30_IX,                       // not used by client\r
-  VEND_31_IX,                       // not used by client\r
-  VEND_32_IX,                       // not used by client\r
-  VEND_33_IX,                       // not used by client\r
-  VEND_34_IX,                       // not used by client\r
-  VEND_35_IX,                       // not used by client\r
-  VEND_36_IX,                       // not used by client\r
-  VEND_37_IX,                       // not used by client\r
-  VEND_38_IX,                       // not used by client\r
-  VEND_39_IX,                       // not used by client\r
-  VEND_40_IX,                       // not used by client\r
-  VEND_41_IX,                       // not used by client\r
-  VEND_42_IX,                       // not used by client\r
-  VEND_43_IX,                       // not used by client\r
-  VEND_44_IX,                       // not used by client\r
-  VEND_45_IX,                       // not used by client\r
-  VEND_46_IX,                       // not used by client\r
-  VEND_47_IX,                       // not used by client\r
-  VEND_48_IX,                       // not used by client\r
-  VEND_49_IX,                       // not used by client\r
-  VEND_50_IX,                       // not used by client\r
-  VEND_51_IX,                       // not used by client\r
-  VEND_52_IX,                       // not used by client\r
-  VEND_53_IX,                       // not used by client\r
-  VEND_54_IX,                       // not used by client\r
-  VEND_55_IX,                       // not used by client\r
-  VEND_56_IX,                       // not used by client\r
-  VEND_57_IX,                       // not used by client\r
-  VEND_58_IX,                       // not used by client\r
-  VEND_59_IX,                       // not used by client\r
-  VEND_60_IX,                       // not used by client\r
-  VEND_61_IX,                       // not used by client\r
-  VEND_62_IX,                       // not used by client\r
-  VEND_63_IX,                       // not used by client\r
-  VEND_64_IX,                       // not used by client\r
-  VEND_65_IX,                       // not used by client\r
-  VEND_66_IX,                       // not used by client\r
-  VEND_67_IX,                       // not used by client\r
-  VEND_68_IX,                       // not used by client\r
-  VEND_69_IX,                       // not used by client\r
-  VEND_70_IX,                       // not used by client\r
-  VEND_PXE_BOOT_ITEM_IX\r
-};\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// array of options in which we are interested\r
-// value 0 -> not of interest, else value is index into OPTION array\r
-// option values from 1 to MAX_OUR_OPT\r
-//\r
-UINT8  OurDhcpOptions[MAX_OUR_OPT] = {\r
-  OP_SUBNET_MASK_IX,                      // OP_SUBNET_MASK   1   // data is the subnet mask\r
-  OP_TIME_OFFSET_IX,                      // OP_TIME_OFFSET   2   // data is the time offset of subnet to UTC in seconds\r
-  OP_ROUTER_LIST_IX,                      // OP_ROUTER_LIST   3   // list of routers on subnet\r
-  OP_TIME_SERVERS_IX,                     // OP_TIME_SERVERS  4   // list of time servers available\r
-  OP_NAME_SERVERS_IX,                     // OP_NAME_SERVERS  5   // list of name servers available\r
-  OP_DNS_SERVERS_IX,                      // OP_DNS_SERVERS   6   // list of DNS servers available\r
-  OP_LOG_SERVERS_IX,                      // OP_LOG_SERVERS   7\r
-  OP_COOKIE_SERVERS_IX,                   // OP_COOKIE_SERVERS    8\r
-  OP_LPR_SREVERS_IX,                      // OP_LPR_SREVERS   9\r
-  OP_IMPRESS_SERVERS_IX,                  // OP_IMPRESS_SERVERS   10\r
-  OP_RES_LOC_SERVERS_IX,                  // OP_RES_LOC_SERVERS   11\r
-  OP_HOST_NAME_IX,                        // OP_HOST_NAME 12  // client name\r
-  OP_BOOT_FILE_SZ_IX,                     // OP_BOOT_FILE_SZ  13  // number of 512 blocks of boot file\r
-  OP_DUMP_FILE_IX,                        // OP_DUMP_FILE 14  // path name of dump file if client crashes\r
-  OP_DOMAIN_NAME_IX,                      // OP_DOMAIN_NAME   15  // domain name to use\r
-  OP_SWAP_SERVER_IX,                      // OP_SWAP_SERVER   16\r
-  OP_ROOT_PATH_IX,                        // OP_ROOT_PATH 17  // path name containing root disk\r
-  OP_EXTENSION_PATH_IX,                   // OP_EXTENSION_PATH    18  // name of TFTP downloadable file of form of OP\r
-  OP_IP_FORWARDING_IX,                    // OP_IP_FORWARDING 19  // enable/disable IP packet forwarding\r
-  OP_NON_LOCAL_SRC_RTE_IX,                // OP_NON_LOCAL_SRC_RTE 20  // enable/disable non local source routing\r
-  OP_POLICY_FILTER_IX,                    // OP_POLICY_FILTER 21  // policy filters for non local source routing\r
-  OP_MAX_DATAGRAM_SZ_IX,                  // OP_MAX_DATAGRAM_SZ   22  // maximum datagram reassembly size\r
-  OP_DEFAULT_TTL_IX,                      // OP_DEFAULT_TTL   23  // default IP time to live\r
-  OP_MTU_AGING_TIMEOUT_IX,                // OP_MTU_AGING_TIMEOUT 24\r
-  OP_MTU_SIZES_IX,                        // OP_MTU_SIZES 25\r
-  OP_MTU_TO_USE_IX,                       // OP_MTU_TO_USE    26\r
-  OP_ALL_SUBNETS_LOCAL_IX,                // OP_ALL_SUBNETS_LOCAL 27\r
-  OP_BROADCAST_ADD_IX,                    // OP_BROADCAST_ADD 28  // broadcast address used on subnet\r
-  OP_PERFORM_MASK_DISCOVERY_IX,           // OP_PERFORM_MASK_DISCOVERY    29  // perform mask discovery using ICMP\r
-  OP_RESPOND_TO_MASK_REQ_IX,              // OP_RESPOND_TO_MASK_REQ   30  // respond to subnet mask requests using ICMP\r
-  OP_PERFORM_ROUTER_DISCOVERY_IX,         // OP_PERFORM_ROUTER_DISCOVERY  31\r
-  OP_ROUTER_SOLICIT_ADDRESS_IX,           // OP_ROUTER_SOLICIT_ADDRESS    32\r
-  OP_STATIC_ROUTER_LIST_IX,               // OP_STATIC_ROUTER_LIST    33  // list of dest/route pairs\r
-  OP_USE_ARP_TRAILERS_IX,                 // OP_USE_ARP_TRAILERS      34\r
-  OP_ARP_CACHE_TIMEOUT_IX,                // OP_ARP_CACHE_TIMEOUT 35\r
-  OP_ETHERNET_ENCAPSULATION_IX,           // OP_ETHERNET_ENCAPSULATION    36  // 0 -> RFC 894, 1 -> IEEE 802.3 (RFC 1042)\r
-  OP_TCP_DEFAULT_TTL_IX,                  // OP_TCP_DEFAULT_TTL   37  // default time to live when sending TCP segments\r
-  OP_TCP_KEEP_ALIVE_INT_IX,               // OP_TCP_KEEP_ALIVE_INT    38  // keep alive interval in seconds\r
-  OP_KEEP_ALIVE_GARBAGE_IX,               // OP_KEEP_ALIVE_GARBAGE    39\r
-  OP_NIS_DOMAIN_NAME_IX,                  // OP_NIS_DOMAIN_NAME   40\r
-  OP_NIS_SERVERS_IX,                      // OP_NIS_SERVERS   41\r
-  OP_NTP_SERVERS_IX,                      // OP_NTP_SERVERS   42\r
-  OP_VENDOR_SPECIFIC_IX,                  // OP_VENDOR_SPECIFIC   43\r
-  OP_NBNS_SERVERS_IX,                     // OP_NBNS_SERVERS  44\r
-  OP_NBDD_SERVERS_IX,                     // OP_NBDD_SERVERS  45\r
-  OP_NETBIOS_NODE_TYPE_IX,                // OP_NETBIOS_NODE_TYPE 46\r
-  OP_NETBIOS_SCOPE_IX,                    // OP_NETBIOS_SCOPE 47\r
-  OP_XWINDOW_SYSTEM_FONT_SERVERS_IX,      // OP_XWINDOW_SYSTEM_FONT_SERVERS   48\r
-  OP_XWINDOW_SYSTEM_DISPLAY_MANAGERS_IX,  // OP_XWINDOW_SYSTEM_DISPLAY_MANAGERS   49\r
-  OP_DHCP_REQ_IP_ADD_IX,                  // OP_DHCP_REQ_IP_ADD   50  // requested IP address - in DHCPDISCOVER\r
-  OP_DHCP_LEASE_TIME_IX,                  // OP_DHCP_LEASE_TIME   51  // lease time requested/granted\r
-  OP_DHCP_OPTION_OVERLOAD_IX,             // OP_DHCP_OPTION_OVERLOAD  52  // file/server name/both used to hold options\r
-  OP_DHCP_MESSAGE_TYPE_IX,                // OP_DHCP_MESSAGE_TYPE 53  // message type\r
-  OP_DHCP_SERVER_IP_IX,                   // OP_DHCP_SERVER_IP    54      // IP of server\r
-  OP_DHCP_PARM_REQ_LIST_IX,               // OP_DHCP_PARM_REQ_LIST    55  // list of requested parameters\r
-  OP_DHCP_ERROR_MESSAGE_IX,               // OP_DHCP_ERROR_MESSAGE    56  // in DHCPNAK or DECLINE messages\r
-  OP_DHCP_MAX_MESSAGE_SZ_IX,              // OP_DHCP_MAX_MESSAGE_SZ   57  // maximum DHCP message size client will accept\r
-  OP_DHCP_RENEWAL_TIME_IX,                // OP_DHCP_RENEWAL_TIME 58  // time in seconds before transitioning to RENEWING state\r
-  OP_DHCP_REBINDING_TIME_IX,              // OP_DHCP_REBINDING_TIME   59  // time in seconds before transitioning to REBINDING state\r
-  OP_DHCP_CLASS_IDENTIFIER_IX,            // OP_DHCP_CLASS_IDENTIFIER 60\r
-  OP_DHCP_CLIENT_IDENTIFIER_IX,           // OP_DHCP_CLIENT_IDENTIFIER    61\r
-  OP_RESERVED62_IX,                       // OP_RESERVED62\r
-  OP_RESERVED63_IX,                       // OP_RESERVED63\r
-  OP_NISPLUS_DOMAIN_NAME_IX,              // OP_NISPLUS_DOMAIN_NAME   64\r
-  OP_NISPLUS_SERVERS_IX,                  // OP_NISPLUS_SERVERS   65\r
-  OP_DHCP_TFTP_SERVER_NAME_IX,            // OP_DHCP_TFTP_SERVER_NAME 66\r
-  OP_DHCP_BOOTFILE_IX                     // OP_DHCP_BOOTFILE 67\r
-};\r
-\r
-#define RxBuf ((DHCP_RECEIVE_BUFFER *) (Private->ReceiveBuffers))\r
-\r
-#pragma pack()\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @param  Smbios              Pointer to SMBIOS structure\r
-  @param  StringNumber        String number to return. 0 is used to skip all\r
-                              strings and  point to the next SMBIOS structure.\r
-\r
-  @return Pointer to string, or pointer to next SMBIOS strcuture if StringNumber == 0\r
-\r
-**/\r
-CHAR8 *\r
-PxeBcLibGetSmbiosString (\r
-  IN  SMBIOS_STRUCTURE_POINTER  *Smbios,\r
-  IN  UINT16                    StringNumber\r
-  )\r
-{\r
-  UINT16  Index;\r
-  CHAR8   *String;\r
-\r
-  //\r
-  // Skip over formatted section\r
-  //\r
-  String = (CHAR8 *) (Smbios->Raw + Smbios->Hdr->Length);\r
-\r
-  //\r
-  // Look through unformated section\r
-  //\r
-  for (Index = 1; Index <= StringNumber || StringNumber == 0; Index++) {\r
-    if (StringNumber == Index) {\r
-      return String;\r
-    }\r
-    //\r
-    // Skip string\r
-    //\r
-    for (; *String != 0; String++)\r
-      ;\r
-    String++;\r
-\r
-    if (*String == 0) {\r
-      //\r
-      // If double NULL then we are done.\r
-      //  Return pointer to next structure in Smbios.\r
-      //  if you pass in a 0 you will always get here\r
-      //\r
-      Smbios->Raw = (UINT8 *)++String;\r
-      return NULL;\r
-    }\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-\r
-/**\r
-  This function gets system guid and serial number from the smbios table\r
-\r
-  @param  SystemGuid          The pointer of returned system guid\r
-  @param  SystemSerialNumber  The pointer of returned system serial number\r
-\r
-  @retval EFI_SUCCESS         Successfully get the system guid and system serial\r
-                              number\r
-  @retval EFI_NOT_FOUND       Not find the SMBIOS table\r
-\r
-**/\r
-EFI_STATUS\r
-PxeBcLibGetSmbiosSystemGuidAndSerialNumber (\r
-  IN  EFI_GUID  *SystemGuid,\r
-  OUT CHAR8     **SystemSerialNumber\r
-  )\r
-{\r
-  EFI_STATUS                Status;\r
-  SMBIOS_TABLE_ENTRY_POINT  *SmbiosTable;\r
-  SMBIOS_STRUCTURE_POINTER  Smbios;\r
-  SMBIOS_STRUCTURE_POINTER  SmbiosEnd;\r
-  UINT16                    Index;\r
-\r
-  Status = EfiGetSystemConfigurationTable (&gEfiSmbiosTableGuid, (VOID **) &SmbiosTable);\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  Smbios.Hdr    = (SMBIOS_STRUCTURE *) (UINTN) SmbiosTable->TableAddress;\r
-  SmbiosEnd.Raw = (UINT8 *) (UINTN) (SmbiosTable->TableAddress + SmbiosTable->TableLength);\r
-\r
-  for (Index = 0; Index < SmbiosTable->TableLength; Index++) {\r
-    if (Smbios.Hdr->Type == 1) {\r
-      if (Smbios.Hdr->Length < 0x19) {\r
-        //\r
-        // Older version did not support Guid and Serial number\r
-        //\r
-        continue;\r
-      }\r
-      //\r
-      // SMBIOS tables are byte packed so we need to do a byte copy to\r
-      // prevend alignment faults on Itanium-based platform.\r
-      //\r
-      CopyMem (SystemGuid, &Smbios.Type1->Uuid, sizeof (EFI_GUID));\r
-      *SystemSerialNumber = PxeBcLibGetSmbiosString (&Smbios, Smbios.Type1->SerialNumber);\r
-\r
-      return EFI_SUCCESS;\r
-    }\r
-    //\r
-    // Make Smbios point to the next record\r
-    //\r
-    PxeBcLibGetSmbiosString (&Smbios, 0);\r
-\r
-    if (Smbios.Raw >= SmbiosEnd.Raw) {\r
-      //\r
-      // SMBIOS 2.1 incorrectly stated the length of SmbiosTable as 0x1e.\r
-      // given this we must double check against the lenght of\r
-      // the structure.\r
-      //\r
-      return EFI_SUCCESS;\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// add router list to list\r
-//\r
-VOID\r
-Ip4AddRouterList (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  DHCPV4_OP_IP_LIST   *IpListPtr\r
-  )\r
-{\r
-  EFI_IP_ADDRESS  TmpIp;\r
-  INTN            Index;\r
-  INTN            num;\r
-\r
-  if (IpListPtr == NULL) {\r
-    return ;\r
-  }\r
-\r
-  for (Index = 0, num = IpListPtr->Header.Length >> 2; Index < num; ++Index) {\r
-    CopyMem (&TmpIp, &IpListPtr->IpList[Index], 4);\r
-    Ip4AddRouter (Private, &TmpIp);\r
-  }\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// send ARP for our IP - fail if someone has it\r
-//\r
-BOOLEAN\r
-SetStationIP (\r
-  PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  EFI_MAC_ADDRESS DestMac;\r
-  EFI_STATUS      EfiStatus;\r
-\r
-  ZeroMem (&DestMac, sizeof DestMac);\r
-\r
-  if (GetHwAddr(Private, (EFI_IP_ADDRESS *)&DHCP_REQ_OPTIONS.OpReqIP.Ip, (EFI_MAC_ADDRESS *)&DestMac)\r
-    || DoArp(Private, (EFI_IP_ADDRESS *)&DHCP_REQ_OPTIONS.OpReqIP.Ip, (EFI_MAC_ADDRESS *)&DestMac) == EFI_SUCCESS) {\r
-    return FALSE;   // somebody else has this IP\r
-  }\r
-\r
-  CopyMem (\r
-    (EFI_IPv4_ADDRESS *) &Private->EfiBc.Mode->StationIp,\r
-    &DHCP_REQ_OPTIONS.OpReqIP.Ip,\r
-    sizeof (EFI_IPv4_ADDRESS)\r
-    );\r
-\r
-  Private->GoodStationIp = TRUE;\r
-\r
-  if (!Private->UseIgmpv1Reporting) {\r
-    return TRUE;\r
-  }\r
-\r
-  if (Private->Igmpv1TimeoutEvent != NULL) {\r
-    return TRUE;\r
-  }\r
-\r
-  EfiStatus = gBS->CreateEvent (\r
-                    EVT_TIMER,\r
-                    TPL_CALLBACK,\r
-                    NULL,\r
-                    NULL,\r
-                    &Private->Igmpv1TimeoutEvent\r
-                    );\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    Private->Igmpv1TimeoutEvent = NULL;\r
-    return TRUE;\r
-  }\r
-\r
-  EfiStatus = gBS->SetTimer (\r
-                    Private->Igmpv1TimeoutEvent,\r
-                    TimerRelative,\r
-                    (UINT64) V1ROUTER_PRESENT_TIMEOUT * 10000000\r
-                    );  /* 400 seconds */\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    gBS->CloseEvent (Private->Igmpv1TimeoutEvent);\r
-    Private->Igmpv1TimeoutEvent = NULL;\r
-  }\r
-\r
-  return TRUE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-AddRouters (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  DHCP_RECEIVE_BUFFER *RxBufPtr\r
-  )\r
-{\r
-  Ip4AddRouterList (\r
-    Private,\r
-    (DHCPV4_OP_IP_LIST *) RxBufPtr->OpAdds.PktOptAdds[OP_ROUTER_LIST_IX - 1]\r
-    );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-EFI_STATUS\r
-DoUdpWrite (\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  EFI_IP_ADDRESS              *ServerIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *ServerPortPtr,\r
-  EFI_IP_ADDRESS              *ClientIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *ClientPortPtr\r
-  )\r
-{\r
-  UINTN Len;\r
-\r
-  Len = sizeof DHCPV4_TRANSMIT_BUFFER;\r
-\r
-  return UdpWrite (\r
-          Private,\r
-          EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT,\r
-          ServerIpPtr,\r
-          ServerPortPtr,\r
-          0,\r
-          ClientIpPtr,\r
-          ClientPortPtr,\r
-          0,\r
-          0,\r
-          &Len,\r
-          Private->TransmitBuffer\r
-          );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// initialize the DHCP structure\r
-//\r
-typedef struct {\r
-  UINT8 x[4];\r
-} C4Str;\r
-\r
-VOID\r
-InitDhcpv4TxBuf (\r
-  PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  UINTN                   HwAddrLen;\r
-  UINT8                   *String;\r
-  CHAR8                   *SystemSerialNumber;\r
-  EFI_PXE_BASE_CODE_MODE  *PxebcMode;\r
-\r
-  PxebcMode = Private->EfiBc.Mode;\r
-\r
-  ZeroMem (&DHCPV4_TRANSMIT_BUFFER, sizeof (DHCPV4_STRUCT));\r
-  DHCPV4_TRANSMIT_BUFFER.op     = BOOTP_REQUEST;\r
-  DHCPV4_TRANSMIT_BUFFER.htype  = Private->SimpleNetwork->Mode->IfType;\r
-  DHCPV4_TRANSMIT_BUFFER.flags  = HTONS (DHCP_BROADCAST_FLAG);\r
-  CopyMem (&DHCPV4_OPTIONS_BUFFER, (VOID *) &DHCPOpStart, sizeof (DHCPOpStart));\r
-\r
-  //\r
-  // default to hardware address\r
-  //\r
-  HwAddrLen = Private->SimpleNetwork->Mode->HwAddressSize;\r
-\r
-  if (HwAddrLen > sizeof DHCPV4_TRANSMIT_BUFFER.chaddr) {\r
-    HwAddrLen = sizeof DHCPV4_TRANSMIT_BUFFER.chaddr;\r
-  }\r
-\r
-  String = (UINT8 *) &Private->SimpleNetwork->Mode->CurrentAddress;\r
-\r
-  if (PxeBcLibGetSmbiosSystemGuidAndSerialNumber (\r
-        (EFI_GUID *) DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid,\r
-        &SystemSerialNumber\r
-        ) == EFI_SUCCESS) {\r
-    if (PxebcMode->SendGUID) {\r
-      HwAddrLen = sizeof (EFI_GUID);\r
-      String    = (UINT8 *) DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid;\r
-    }\r
-  } else {\r
-    //\r
-    // GUID not yet set - send all 0xff's to show programable (via SetVariable)\r
-    // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, sizeof(EFI_GUID), 0xff);\r
-    // GUID not yet set - send all 0's to show not programable\r
-    //\r
-    ZeroMem (DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, sizeof (EFI_GUID));\r
-  }\r
-\r
-  DHCPV4_TRANSMIT_BUFFER.hlen = (UINT8) HwAddrLen;\r
-  CopyMem (DHCPV4_TRANSMIT_BUFFER.chaddr, String, HwAddrLen);\r
-\r
-  CvtNum (\r
-    SYS_ARCH,\r
-    (UINT8 *) DHCPV4_OPTIONS_BUFFER.DhcpClassIdentifier.Data.ArchitectureType,\r
-    sizeof DHCPV4_OPTIONS_BUFFER.DhcpClassIdentifier.Data.ArchitectureType\r
-    );\r
-\r
-  DHCPV4_OPTIONS_BUFFER.DhcpNetworkInterface.Type                         = Private->NiiPtr->Type;\r
-  DHCPV4_OPTIONS_BUFFER.DhcpNetworkInterface.MajorVersion                 = Private->NiiPtr->MajorVer;\r
-  DHCPV4_OPTIONS_BUFFER.DhcpNetworkInterface.MinorVersion                 = Private->NiiPtr->MinorVer;\r
-\r
-  *(C4Str *) DHCPV4_OPTIONS_BUFFER.DhcpClassIdentifier.Data.InterfaceName = *(C4Str *) Private->NiiPtr->StringId;\r
-\r
-  CvtNum (\r
-    DHCPV4_OPTIONS_BUFFER.DhcpNetworkInterface.MajorVersion,\r
-    (UINT8 *) DHCPV4_OPTIONS_BUFFER.DhcpClassIdentifier.Data.UndiMajor,\r
-    sizeof DHCPV4_OPTIONS_BUFFER.DhcpClassIdentifier.Data.UndiMajor\r
-    );\r
-\r
-  CvtNum (\r
-    DHCPV4_OPTIONS_BUFFER.DhcpNetworkInterface.MinorVersion,\r
-    (UINT8 *) DHCPV4_OPTIONS_BUFFER.DhcpClassIdentifier.Data.UndiMinor,\r
-    sizeof DHCPV4_OPTIONS_BUFFER.DhcpClassIdentifier.Data.UndiMinor\r
-    );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-UINT32\r
-DecodePxeOptions (\r
-  DHCP_RECEIVE_BUFFER *RxBufPtr,\r
-  UINT8               *ptr,\r
-  INTN                Len\r
-  )\r
-{\r
-  UINT8     Op;\r
-  UINT8     *EndPtr;\r
-  INTN      Index;\r
-  UNION_PTR LocalPtr;\r
-  UINT32    status;\r
-\r
-  status = 0;\r
-\r
-  for (EndPtr = ptr + Len; ptr < EndPtr; ptr += Len + 2) {\r
-    Op  = ptr[0];\r
-    Len = ptr[1];\r
-\r
-    switch (Op) {\r
-    case OP_PAD:\r
-      Len = -1;\r
-      break;\r
-\r
-    case OP_END:\r
-      return status;\r
-\r
-    default:\r
-      LocalPtr.BytePtr = ptr;\r
-      if (Op <= MAX_OUR_PXE_OPT) {\r
-        Index = ourPXEopts[Op - 1];\r
-        if (Index) {\r
-          RxBufPtr->OpAdds.PxeOptAdds[Index - 1] = LocalPtr.OpPtr;\r
-          status |= 1 << Index;\r
-          if (Index == VEND_PXE_BOOT_ITEM && LocalPtr.BootItem->Header.Length == 3) {\r
-            RxBufPtr->OpAdds.Status |= USE_THREE_BYTE;\r
-          }\r
-        }\r
-      }\r
-      break;\r
-    }\r
-  }\r
-\r
-  return status;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-DecodeOptions (\r
-  DHCP_RECEIVE_BUFFER *RxBufPtr,\r
-  UINT8               *ptr,\r
-  INTN                Len\r
-  )\r
-{\r
-  UINT8     Op;\r
-  UINT8     *EndPtr;\r
-  INTN      Index;\r
-  UNION_PTR LocalPtr;\r
-\r
-  for (EndPtr = ptr + Len; ptr < EndPtr; ptr += Len + 2) {\r
-    Op  = ptr[0];\r
-    Len = ptr[1];\r
-\r
-    switch (Op) {\r
-    case OP_PAD:\r
-      Len = -1;\r
-      break;\r
-\r
-    case OP_END:\r
-      return ;\r
-\r
-    default:\r
-      LocalPtr.BytePtr = ptr;\r
-      if (Op <= MAX_OUR_OPT) {\r
-        Index = OurDhcpOptions[Op - 1];\r
-        if (Index) {\r
-          RxBufPtr->OpAdds.PktOptAdds[Index - 1] = LocalPtr.OpPtr;\r
-          if (Index == OP_VENDOR_SPECIFIC_IX) {\r
-            UINT32  status;\r
-            status = DecodePxeOptions (\r
-                      RxBufPtr,\r
-                      (UINT8 *) LocalPtr.VendorOptions->VendorOptions,\r
-                      LocalPtr.VendorOptions->Header.Length\r
-                      );\r
-            if (status) {\r
-              RxBufPtr->OpAdds.Status |= PXE_TYPE;\r
-              //\r
-              // check for all the MTFTP info options present - any missing is a nogo\r
-              //\r
-              if ((status & WfM11a_OPTS) == WfM11a_OPTS) {\r
-                RxBufPtr->OpAdds.Status |= WfM11a_TYPE;\r
-              }\r
-\r
-              if (status & DISCOVER_OPTS) {\r
-                RxBufPtr->OpAdds.Status |= DISCOVER_TYPE;\r
-              }\r
-\r
-              if (status & CREDENTIALS_OPT) {\r
-                RxBufPtr->OpAdds.Status |= CREDENTIALS_TYPE;\r
-              }\r
-            }\r
-          }\r
-        }\r
-      }\r
-      break;\r
-    }\r
-  }\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-Parse (\r
-  DHCP_RECEIVE_BUFFER *RxBufPtr,\r
-  INTN                Len\r
-  )\r
-{\r
-  UNION_PTR LocalPtr;\r
-\r
-  //\r
-  // initialize\r
-  //\r
-  SetMem (&RxBufPtr->OpAdds, sizeof RxBufPtr->OpAdds, 0);\r
-\r
-  DecodeOptions (\r
-    RxBufPtr,\r
-    RxBufPtr->u.Dhcpv4.options + 4,\r
-    Len - (sizeof RxBufPtr->u.Dhcpv4 - sizeof RxBufPtr->u.Dhcpv4.options + 4)\r
-    );\r
-\r
-  LocalPtr.OpPtr = RxBufPtr->OpAdds.PktOptAdds[OP_DHCP_OPTION_OVERLOAD_IX - 1];\r
-\r
-  if ((LocalPtr.OpPtr) && (LocalPtr.Overload->Overload & OVLD_SRVR_NAME)) {\r
-    DecodeOptions (RxBufPtr, RxBufPtr->u.Dhcpv4.sname, sizeof RxBufPtr->u.Dhcpv4.sname);\r
-  }\r
-\r
-  if (LocalPtr.OpPtr && (LocalPtr.Overload->Overload & OVLD_FILE)) {\r
-    DecodeOptions (RxBufPtr, RxBufPtr->u.Dhcpv4.file, sizeof RxBufPtr->u.Dhcpv4.file);\r
-  } else if (!RxBufPtr->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1] && RxBufPtr->u.Dhcpv4.file[0]) {\r
-    RxBufPtr->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1] = (DHCPV4_OP_STRUCT *) (RxBufPtr->u.Dhcpv4.file - sizeof (DHCPV4_OP_HEADER));\r
-\r
-    RxBufPtr->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1]->Header.Length = (UINT8) AsciiStrLen ((CHAR8 *) RxBufPtr->u.Dhcpv4.file);\r
-  }\r
-\r
-  LocalPtr.OpPtr = RxBufPtr->OpAdds.PktOptAdds[OP_DHCP_CLASS_IDENTIFIER_IX - 1];\r
-\r
-  if ((LocalPtr.OpPtr) &&\r
-      LocalPtr.PxeClassStr->Header.Length >= 9 &&\r
-      !CompareMem (LocalPtr.PxeClassStr->Class, "PXEClient", 9)\r
-        ) {\r
-    RxBufPtr->OpAdds.Status |= PXE_TYPE;\r
-  }\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-CopyParseRxBuf (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  INTN                RxBufIndex,\r
-  INTN                PacketIndex\r
-  )\r
-{\r
-  DHCP_RECEIVE_BUFFER *RxBufPtr;\r
-\r
-  RxBufPtr = &((DHCP_RECEIVE_BUFFER *) Private->DhcpPacketBuffer)[PacketIndex];\r
-\r
-  CopyMem (\r
-    &RxBufPtr->u.Dhcpv4,\r
-    &RxBuf[RxBufIndex].u.Dhcpv4,\r
-    sizeof (RxBuf[RxBufIndex].u.Dhcpv4)\r
-    );\r
-\r
-  Parse (RxBufPtr, sizeof RxBufPtr->u.ReceiveBuffer);\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-CopyProxyRxBuf (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  INTN                RxBufIndex\r
-  )\r
-{\r
-  Private->EfiBc.Mode->ProxyOfferReceived = TRUE;\r
-  CopyParseRxBuf (Private, RxBufIndex, PXE_OFFER_INDEX);\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-CopyParse (\r
-  PXE_BASECODE_DEVICE       *Private,\r
-  EFI_PXE_BASE_CODE_PACKET  *PacketPtr,\r
-  EFI_PXE_BASE_CODE_PACKET  *NewPacketPtr,\r
-  INTN                      Index\r
-  )\r
-{\r
-  DHCP_RECEIVE_BUFFER *DhcpRxBuf;\r
-\r
-  DhcpRxBuf = &((DHCP_RECEIVE_BUFFER *) Private->DhcpPacketBuffer)[Index];\r
-\r
-  CopyMem (\r
-    (EFI_PXE_BASE_CODE_PACKET *) &DhcpRxBuf->u.Dhcpv4,\r
-    NewPacketPtr,\r
-    sizeof (*NewPacketPtr)\r
-    );\r
-\r
-  CopyMem (&*PacketPtr, &*NewPacketPtr, sizeof (*NewPacketPtr));\r
-\r
-  Parse (DhcpRxBuf, sizeof DhcpRxBuf->u.ReceiveBuffer);\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-BOOLEAN\r
-AckEdit (\r
-  DHCP_RECEIVE_BUFFER *DhcpRxBuf\r
-  )\r
-{\r
-  UNION_PTR LocalPtr;\r
-\r
-  LocalPtr.OpPtr = DhcpRxBuf->OpAdds.PktOptAdds[OP_DHCP_MESSAGE_TYPE_IX - 1];\r
-\r
-  //\r
-  // check that an ACK\r
-  // if a DHCP type, must be DHCPOFFER and must have server id\r
-  //\r
-  return (BOOLEAN)\r
-    (\r
-      (LocalPtr.OpPtr) &&\r
-      (LocalPtr.MessageType->Type == DHCPACK) &&\r
-      DhcpRxBuf->OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1]\r
-    );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// if a discover type packet, make sure all required fields are present\r
-//\r
-BOOLEAN\r
-DHCPOfferAckEdit (\r
-  DHCP_RECEIVE_BUFFER *DhcpRxBuf\r
-  )\r
-{\r
-  PXE_OP_SERVER_LIST  *BootServerOpPtr;\r
-  UNION_PTR           LocalPtr;\r
-\r
-  if ((DhcpRxBuf->OpAdds.Status & DISCOVER_TYPE) == 0) {\r
-    return TRUE;\r
-  }\r
-\r
-  LocalPtr.OpPtr = DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_DISCOVERY_CONTROL_IX - 1];\r
-\r
-  if (LocalPtr.OpPtr == NULL) {\r
-    LocalPtr.OpPtr  = (DHCPV4_OP_STRUCT *) &DefaultDisCtl;\r
-    DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_DISCOVERY_CONTROL_IX - 1] = (DHCPV4_OP_STRUCT *) &DefaultDisCtl;\r
-  }\r
-  //\r
-  // make sure all required fields are here\r
-  // if mucticast enabled, need multicast address\r
-  //\r
-  if (!(LocalPtr.DiscoveryControl->ControlBits & DISABLE_MCAST) &&\r
-      (!DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_DISCOVERY_MCAST_ADDR_IX - 1] || !IS_MULTICAST (((DHCPV4_OP_STRUCT *) DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_DISCOVERY_MCAST_ADDR_IX - 1])->Data))\r
-      ) {\r
-    return FALSE;\r
-    //\r
-    // missing required field\r
-    //\r
-  }\r
-  //\r
-  // if a list, it better be good\r
-  //\r
-  BootServerOpPtr = (PXE_OP_SERVER_LIST *) DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_BOOT_SERVERS_IX - 1];\r
-\r
-  if (BootServerOpPtr != NULL) {\r
-    PXE_SERVER_LIST *BootServerListPtr;\r
-    INTN            ServerListLen;\r
-    INTN            ServerEntryLen;\r
-\r
-    BootServerListPtr = BootServerOpPtr->ServerList;\r
-    ServerListLen     = BootServerOpPtr->Header.Length;\r
-\r
-    do {\r
-      EFI_IPv4_ADDRESS  *IpListPtr;\r
-      INTN              IpCnt;\r
-\r
-      IpCnt           = BootServerListPtr->u.Ipv4List.IpCount;\r
-\r
-      ServerEntryLen  = sizeof (PXEV4_SERVER_LIST) + 2 + (IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS);\r
-\r
-      if (ServerListLen < ServerEntryLen) {\r
-        //\r
-        // missing required field\r
-        //\r
-        return FALSE;\r
-      }\r
-\r
-      IpListPtr = BootServerListPtr->u.Ipv4List.IpList;\r
-\r
-      while (IpCnt--) {\r
-        if (IS_MULTICAST (IpListPtr)) {\r
-          //\r
-          // missing required field\r
-          //\r
-          return FALSE;\r
-        } else {\r
-          ++IpListPtr;\r
-        }\r
-      }\r
-\r
-      BootServerListPtr = (PXE_SERVER_LIST *) IpListPtr;\r
-    } while (ServerListLen -= ServerEntryLen);\r
-  }\r
-  //\r
-  // else there must be a list if use list enabled or multicast and\r
-  // broadcast disabled\r
-  //\r
-  else if ((LocalPtr.DiscoveryControl->ControlBits & USE_ACCEPT_LIST) ||\r
-           ((LocalPtr.DiscoveryControl->ControlBits & (DISABLE_MCAST | DISABLE_BCAST)) == (DISABLE_MCAST | DISABLE_BCAST))\r
-          ) {\r
-    //\r
-    // missing required field\r
-    //\r
-    return FALSE;\r
-  }\r
-  //\r
-  // if not USE_BOOTFILE or no bootfile given, must have menu stuff\r
-  //\r
-  if (!(LocalPtr.DiscoveryControl->ControlBits & USE_BOOTFILE) ||\r
-      !DhcpRxBuf->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1]\r
-      ) {\r
-    INTN  MenuLth;\r
-\r
-    LocalPtr.OpPtr = DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_BOOT_MENU_IX - 1];\r
-\r
-    if (LocalPtr.OpPtr == NULL || !DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_BOOT_PROMPT_IX - 1]) {\r
-      //\r
-      // missing required field\r
-      //\r
-      return FALSE;\r
-    }\r
-    //\r
-    // make sure menu valid\r
-    //\r
-    MenuLth               = LocalPtr.BootMenu->Header.Length;\r
-    LocalPtr.BootMenuItem = LocalPtr.BootMenu->MenuItem;\r
-\r
-    do {\r
-      INTN  MenuItemLen;\r
-\r
-      MenuItemLen = LocalPtr.BootMenuItem->DataLen;\r
-\r
-      if (MenuItemLen == 0) {\r
-        //\r
-        // missing required field\r
-        //\r
-        return FALSE;\r
-      }\r
-\r
-      MenuItemLen += sizeof (*LocalPtr.BootMenuItem) - sizeof (LocalPtr.BootMenuItem->Data);\r
-\r
-      MenuLth -= MenuItemLen;\r
-      LocalPtr.BytePtr += MenuItemLen;\r
-    } while (MenuLth > 0);\r
-\r
-    if (MenuLth != 0) {\r
-      //\r
-      // missing required field\r
-      //\r
-      return FALSE;\r
-    }\r
-  }\r
-\r
-  if (!DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_BOOT_ITEM_IX - 1]) {\r
-    DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_BOOT_ITEM_IX - 1] = (DHCPV4_OP_STRUCT *) &DefaultBootItem;\r
-  }\r
-\r
-  return TRUE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-BOOLEAN\r
-DHCPAckEdit (\r
-  DHCP_RECEIVE_BUFFER *RxBufPtr\r
-  )\r
-{\r
-  return (BOOLEAN) (DHCPOfferAckEdit (RxBufPtr) ? AckEdit (RxBufPtr) : FALSE);\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// get an offer/ack\r
-//\r
-EFI_STATUS\r
-GetOfferAck (\r
-  PXE_BASECODE_DEVICE          *Private,\r
-  BOOLEAN                     (*ExtraEdit)(DHCP_RECEIVE_BUFFER *DhcpRxBuf),\r
-  UINT16 OpFlags, // for Udp read\r
-  EFI_IP_ADDRESS *ServerIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT *ServerPortPtr,\r
-  EFI_IP_ADDRESS *ClientIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT *ClientPortPtr,\r
-  DHCP_RECEIVE_BUFFER *DhcpRxBuf,\r
-  EFI_EVENT TimeoutEvent\r
-  )\r
-/*++\r
-Routine description:\r
-  Wait for an OFFER/ACK packet.\r
-\r
-Parameters:\r
-  Private := Pointer to PxeBc interface\r
-  ExtraEdit := Pointer to extra option checking function\r
-  OpFlags := UdpRead() option flags\r
-  ServerIpPtr :=\r
-  ServerPortPtr :=\r
-  ClientIpPtr :=\r
-  ClientPortPtr :=\r
-  DhcpRxBuf :=\r
-  TimeoutEvent :=\r
-\r
-Returns:\r
---*/\r
-{\r
-  EFI_IP_ADDRESS  ServerIp;\r
-  EFI_STATUS      StatCode;\r
-  INTN            RxBufLen;\r
-\r
-  for (;;) {\r
-    //\r
-    // Wait until we get a UDP packet.\r
-    //\r
-    ZeroMem (&ServerIp, sizeof (EFI_IP_ADDRESS));\r
-    RxBufLen = sizeof RxBuf[0].u.ReceiveBuffer;\r
-\r
-    if ((StatCode = UdpRead (\r
-                      Private,\r
-                      OpFlags,\r
-                      ClientIpPtr,\r
-                      ClientPortPtr,\r
-                      ServerIpPtr,\r
-                      ServerPortPtr,\r
-                      0,\r
-                      0,\r
-                      (UINTN *) &RxBufLen,\r
-                      &DhcpRxBuf->u.Dhcpv4,\r
-                      TimeoutEvent\r
-                      )) != EFI_SUCCESS) {\r
-      if (StatCode == EFI_TIMEOUT) {\r
-        StatCode = EFI_NO_RESPONSE;\r
-      }\r
-\r
-      break;\r
-    }\r
-    //\r
-    // got a packet - see if a good offer\r
-    //\r
-    if (DhcpRxBuf->u.Dhcpv4.op != BOOTP_REPLY) {\r
-      continue;\r
-    }\r
-\r
-    if (DhcpRxBuf->u.Dhcpv4.xid != DHCPV4_TRANSMIT_BUFFER.xid) {\r
-      continue;\r
-    }\r
-\r
-    if (*(UINT32 *) DHCPV4_TRANSMIT_BUFFER.options != * (UINT32 *) DhcpRxBuf->u.Dhcpv4.options) {\r
-      continue;\r
-    }\r
-\r
-    if (*(UINT8 *) &DhcpRxBuf->u.Dhcpv4.yiaddr > 223) {\r
-      continue;\r
-    }\r
-\r
-    if (CompareMem (\r
-          DhcpRxBuf->u.Dhcpv4.chaddr,\r
-          DHCPV4_TRANSMIT_BUFFER.chaddr,\r
-          sizeof DhcpRxBuf->u.Dhcpv4.chaddr\r
-          )) {\r
-      //\r
-      // no good\r
-      //\r
-      continue;\r
-    }\r
-\r
-    Parse (DhcpRxBuf, RxBufLen);\r
-\r
-    if (!(*ExtraEdit) (DhcpRxBuf)) {\r
-      continue;\r
-    }\r
-    //\r
-    // Good DHCP packet.\r
-    //\r
-    StatCode = EFI_SUCCESS;\r
-    break;\r
-  }\r
-\r
-  return StatCode;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// get DHCPOFFER's\r
-//\r
-EFI_STATUS\r
-GetOffers (\r
-  PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  EFI_IP_ADDRESS  ClientIp;\r
-  EFI_IP_ADDRESS  ServerIp;\r
-  EFI_STATUS      StatCode;\r
-  EFI_EVENT       TimeoutEvent;\r
-  INTN            NumOffers;\r
-  INTN            Index;\r
-\r
-  //\r
-  //\r
-  //\r
-  ZeroMem (&ServerIp, sizeof (EFI_IP_ADDRESS));\r
-  NumOffers = 0;\r
-\r
-  for (Index = 0; Index < (sizeof Private->ServerCount) / sizeof Private->ServerCount[0]; ++Index) {\r
-    Private->ServerCount[Index] = 0;\r
-    Private->GotProxy[Index]    = 0;\r
-  }\r
-\r
-  Private->GotBootp               = 0;\r
-  //\r
-  // these we throw away\r
-  //\r
-  Private->GotProxy[DHCP_ONLY_IX] = 1;\r
-  StatCode = gBS->CreateEvent (\r
-                    EVT_TIMER,\r
-                    TPL_CALLBACK,\r
-                    NULL,\r
-                    NULL,\r
-                    &TimeoutEvent\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    return StatCode;\r
-  }\r
-\r
-  StatCode = gBS->SetTimer (\r
-                    TimeoutEvent,\r
-                    TimerRelative,\r
-                    Private->Timeout * 10000000 + 1000000\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return StatCode;\r
-  }\r
-  //\r
-  // get offers\r
-  //\r
-  for (;;) {\r
-    DHCP_RECEIVE_BUFFER *DhcpRxBuf;\r
-    UNION_PTR           LocalPtr;\r
-\r
-    DhcpRxBuf = &RxBuf[NumOffers];\r
-\r
-    if ((\r
-          StatCode = GetOfferAck (\r
-                  Private,\r
-        DHCPOfferAckEdit,\r
-        EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP |\r
-        EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP |\r
-        EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT,\r
-        &ServerIp,\r
-        &DhcpServerPort,\r
-        &ClientIp,\r
-        &DHCPClientPort,\r
-        DhcpRxBuf,\r
-        TimeoutEvent\r
-        )\r
-) != EFI_SUCCESS\r
-        ) {\r
-      break;\r
-    }\r
-\r
-    LocalPtr.OpPtr = DhcpRxBuf->OpAdds.PktOptAdds[OP_DHCP_MESSAGE_TYPE_IX - 1];\r
-\r
-    //\r
-    // check type of offer\r
-    //\r
-    if (LocalPtr.OpPtr == NULL) {\r
-      //\r
-      // bootp - we only need one and make sure has bootfile\r
-      //\r
-      if (Private->GotBootp || !DhcpRxBuf->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1]) {\r
-        continue;\r
-      }\r
-\r
-      Private->GotBootp = (UINT8) (NumOffers + 1);\r
-    }\r
-    //\r
-    // if a DHCP type, must be DHCPOFFER and must have server id\r
-    //\r
-    else if (LocalPtr.MessageType->Type != DHCPOFFER || !DhcpRxBuf->OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1]) {\r
-      continue;\r
-    } else {\r
-      INTN  TypeIx;\r
-\r
-      //\r
-      // get type - PXE10, WfM11a, or BINL\r
-      //\r
-      if (DhcpRxBuf->OpAdds.Status & DISCOVER_TYPE) {\r
-        TypeIx = PXE10_IX;\r
-      } else if (DhcpRxBuf->OpAdds.Status & WfM11a_TYPE) {\r
-        //\r
-        // WfM - make sure it has a bootfile\r
-        //\r
-        if (!DhcpRxBuf->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1]) {\r
-          continue;\r
-        }\r
-\r
-        TypeIx = WfM11a_IX;\r
-      } else {\r
-        TypeIx = (DhcpRxBuf->OpAdds.Status & PXE_TYPE) ? BINL_IX : DHCP_ONLY_IX;\r
-      }\r
-      //\r
-      // check DHCP or proxy\r
-      //\r
-      if (DhcpRxBuf->u.Dhcpv4.yiaddr == 0) {\r
-        //\r
-        // proxy - only need one of each type if not BINL\r
-        // and must have at least PXE_TYPE\r
-        //\r
-        if (TypeIx == BINL_IX) {\r
-          Private->BinlProxies[Private->GotProxy[BINL_IX]++] = (UINT8) NumOffers;\r
-        } else if (Private->GotProxy[TypeIx]) {\r
-          continue;\r
-        } else {\r
-          Private->GotProxy[TypeIx] = (UINT8) (NumOffers + 1);\r
-        }\r
-      } else {\r
-        Private->OfferCount[TypeIx][Private->ServerCount[TypeIx]++] = (UINT8) NumOffers;\r
-      }\r
-    }\r
-\r
-    if (++NumOffers == MAX_OFFERS) {\r
-      break;\r
-    }\r
-  }\r
-\r
-  gBS->CloseEvent (TimeoutEvent);\r
-  Private->NumOffersReceived = NumOffers;\r
-\r
-  return (Private->NumOffersReceived) ? EFI_SUCCESS : EFI_NO_RESPONSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// send DHCPDECLINE\r
-//\r
-VOID\r
-DeclineOffer (\r
-  PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxebcMode;\r
-  UINT16                  SaveSecs;\r
-\r
-  PxebcMode                     = Private->EfiBc.Mode;\r
-  SaveSecs                      = DHCPV4_TRANSMIT_BUFFER.secs;\r
-\r
-  DHCPV4_TRANSMIT_BUFFER.secs   = 0;\r
-  DHCPV4_TRANSMIT_BUFFER.flags  = 0;\r
-  SetMem (\r
-    DHCPV4_TRANSMIT_BUFFER.options + sizeof (struct opdeclinestr),\r
-    sizeof (DHCPOpStart) - sizeof (struct opdeclinestr),\r
-    OP_PAD\r
-    );\r
-  DHCPDECLINEoptions.DhcpMessageType.Type = DHCPDECLINE;\r
-  CopyMem (&DHCPDECLINEoptions.OpDeclineEnd, &DHCP_REQ_OPTIONS, sizeof (DHCPDECLINEoptions.OpDeclineEnd));\r
-\r
-  {\r
-    EFI_IP_ADDRESS  TmpIp;\r
-\r
-    CopyMem (&TmpIp, &DHCP_REQ_OPTIONS.DhcServerIpPtr.Ip, sizeof TmpIp);\r
-\r
-    DoUdpWrite (\r
-      Private,\r
-      &TmpIp,\r
-      &DhcpServerPort,\r
-      &PxebcMode->StationIp,\r
-      &DHCPClientPort\r
-      );\r
-  }\r
-\r
-  InitDhcpv4TxBuf (Private);\r
-  DHCPV4_TRANSMIT_BUFFER.secs = SaveSecs;\r
-  Private->GoodStationIp      = FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// send DHCPRELEASE\r
-//\r
-BOOLEAN\r
-Release (\r
-  PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxebcMode;\r
-  UINT16                  SaveSecs;\r
-\r
-  PxebcMode                   = Private->EfiBc.Mode;\r
-  SaveSecs                    = DHCPV4_TRANSMIT_BUFFER.secs;\r
-  DHCPV4_TRANSMIT_BUFFER.secs = 0;\r
-\r
-  SetMem (\r
-    DHCPV4_TRANSMIT_BUFFER.options + sizeof (struct opreleasestr),\r
-    sizeof (DHCPOpStart) - sizeof (struct opreleasestr),\r
-    OP_PAD\r
-    );\r
-\r
-  DHCPRELEASEoptions.DhcpMessageType.Type = DHCPRELEASE;\r
-\r
-  CopyMem (\r
-    &DHCPRELEASEoptions.DhcServerIpPtr,\r
-    (DHCPV4_OP_SERVER_IP *) DHCPV4_ACK_BUFFER.OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1],\r
-    sizeof DHCPRELEASEoptions.DhcServerIpPtr\r
-    );\r
-\r
-  DHCPRELEASEoptions.End[0] = OP_END;\r
-\r
-  {\r
-    EFI_IP_ADDRESS  TmpIp;\r
-\r
-    CopyMem (&TmpIp, &DHCPRELEASEoptions.DhcServerIpPtr.Ip, sizeof TmpIp);\r
-\r
-    DoUdpWrite (\r
-      Private,\r
-      &TmpIp,\r
-      &DhcpServerPort,\r
-      &PxebcMode->StationIp,\r
-      &DHCPClientPort\r
-      );\r
-  }\r
-\r
-  InitDhcpv4TxBuf (Private);\r
-\r
-  DHCPV4_TRANSMIT_BUFFER.secs = SaveSecs;\r
-  Private->GoodStationIp      = FALSE;\r
-  return FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-BOOLEAN\r
-GetBINLAck (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  EFI_IP_ADDRESS      *ServerIpPtr\r
-  )\r
-{\r
-  DHCP_RECEIVE_BUFFER *DhcpRxBuf;\r
-  EFI_STATUS          StatCode;\r
-  EFI_EVENT           TimeoutEvent;\r
-\r
-  //\r
-  //\r
-  //\r
-  StatCode = gBS->CreateEvent (\r
-                    EVT_TIMER,\r
-                    TPL_CALLBACK,\r
-                    NULL,\r
-                    NULL,\r
-                    &TimeoutEvent\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    return FALSE;\r
-  }\r
-\r
-  StatCode = gBS->SetTimer (\r
-                    TimeoutEvent,\r
-                    TimerRelative,\r
-                    Private->Timeout * 10000000 + 1000000\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return FALSE;\r
-  }\r
-  //\r
-  //\r
-  //\r
-  DhcpRxBuf = &PXE_BINL_BUFFER;\r
-\r
-  for (;;) {\r
-    EFI_PXE_BASE_CODE_UDP_PORT  BINLSrvPort;\r
-\r
-    BINLSrvPort = 0;\r
-\r
-    if (GetOfferAck (\r
-          Private,\r
-          AckEdit,\r
-          EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT,\r
-          ServerIpPtr,\r
-          &BINLSrvPort,\r
-          &Private->EfiBc.Mode->StationIp,\r
-          &PSEUDO_DHCP_CLIENT_PORT,\r
-          DhcpRxBuf,\r
-          TimeoutEvent\r
-          ) != EFI_SUCCESS) {\r
-      break;\r
-    }\r
-    //\r
-    // make sure from whom we wanted\r
-    //\r
-    if (!DhcpRxBuf->u.Dhcpv4.yiaddr && !CompareMem (\r
-                                          &ServerIpPtr->v4,\r
-                                          &((DHCPV4_OP_SERVER_IP *) DhcpRxBuf->OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1])->Ip,\r
-                                          sizeof (ServerIpPtr->v4)\r
-                                          )) {\r
-      gBS->CloseEvent (TimeoutEvent);\r
-      //\r
-      // got an ACK from server\r
-      //\r
-      return TRUE;\r
-    }\r
-  }\r
-\r
-  gBS->CloseEvent (TimeoutEvent);\r
-  return FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// make sure we can get BINL\r
-// send DHCPREQUEST to PXE server\r
-//\r
-BOOLEAN\r
-TryBINL (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  INTN                OfferIx\r
-  )\r
-{\r
-  DHCP_RECEIVE_BUFFER *DhcpRxBuf;\r
-  EFI_IP_ADDRESS      ServerIp;\r
-  UINT16              SaveSecs;\r
-  INTN                Index;\r
-\r
-  DhcpRxBuf = &RxBuf[OfferIx];\r
-\r
-  //\r
-  // use next server address first.\r
-  //\r
-  ServerIp.Addr[0] = DhcpRxBuf->u.Dhcpv4.siaddr;\r
-  if (ServerIp.Addr[0] == 0) {\r
-    //\r
-    // next server address is NULL, use option 54.\r
-    //\r
-    CopyMem (\r
-      ((EFI_IPv4_ADDRESS *) &ServerIp),\r
-      &((DHCPV4_OP_SERVER_IP *) DhcpRxBuf->OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1])->Ip,\r
-      sizeof (EFI_IPv4_ADDRESS)\r
-      );\r
-  }\r
-\r
-  //\r
-  // client IP address - filled in by client if it knows it\r
-  //\r
-  CopyMem (\r
-    ((EFI_IPv4_ADDRESS *) &DHCPV4_TRANSMIT_BUFFER.ciaddr),\r
-    &DHCP_REQ_OPTIONS.OpReqIP.Ip,\r
-    sizeof (EFI_IPv4_ADDRESS)\r
-    );\r
-\r
-  SetMem (&DHCP_REQ_OPTIONS, sizeof DHCP_REQ_OPTIONS, OP_PAD);\r
-  DHCPV4_TRANSMIT_BUFFER.flags  = 0;\r
-  DHCPV4_OPTIONS_BUFFER.End[0]  = OP_END;\r
-  AddRouters (Private, DhcpRxBuf);\r
-  SaveSecs = DHCPV4_TRANSMIT_BUFFER.secs;\r
-\r
-  for (Index = 0; Index < 3; Private->TotalSeconds = (UINT16) (Private->TotalSeconds + Private->Timeout), ++Index) {\r
-    DHCPV4_TRANSMIT_BUFFER.secs = HTONS (Private->TotalSeconds);\r
-\r
-    //\r
-    // unicast DHCPREQUEST to PXE server\r
-    //\r
-    if (DoUdpWrite (\r
-          Private,\r
-          &ServerIp,\r
-          &PseudoDhcpServerPort,\r
-          (EFI_IP_ADDRESS *) &DHCPV4_TRANSMIT_BUFFER.ciaddr,\r
-          &PSEUDO_DHCP_CLIENT_PORT\r
-          ) != EFI_SUCCESS) {\r
-      break;\r
-    }\r
-\r
-    if (!GetBINLAck (Private, &ServerIp)) {\r
-      continue;\r
-    }\r
-    //\r
-    // early exit failures\r
-    // make sure a good ACK\r
-    //\r
-    if (!DHCPOfferAckEdit (&PXE_BINL_BUFFER) || (\r
-          !(PXE_BINL_BUFFER.OpAdds.Status & DISCOVER_TYPE) && !PXE_BINL_BUFFER.OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1]\r
-      )\r
-        ) {\r
-      break;\r
-    }\r
-\r
-    Private->EfiBc.Mode->ProxyOfferReceived = TRUE;\r
-    return TRUE;\r
-  }\r
-  //\r
-  // failed - reset seconds field, etc.\r
-  //\r
-  Private->EfiBc.Mode->RouteTableEntries = 0;\r
-  //\r
-  // reset\r
-  //\r
-  DHCPV4_TRANSMIT_BUFFER.secs = SaveSecs;\r
-  return FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-BOOLEAN\r
-TryFinishBINL (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  INTN                OfferIx\r
-  )\r
-{\r
-  if (TryBINL (Private, OfferIx)) {\r
-    return TRUE;\r
-  }\r
-\r
-  return Release (Private);\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-BOOLEAN\r
-TryFinishProxyBINL (\r
-  PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  INTN  Index;\r
-\r
-  for (Index = 0; Index < Private->GotProxy[BINL_IX]; ++Index) {\r
-    if (TryBINL (Private, Private->BinlProxies[Index])) {\r
-      return TRUE;\r
-    }\r
-  }\r
-\r
-  return Release (Private);\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// try to finish DORA - send DHCP request, wait for ACK, check with ARP\r
-//\r
-BOOLEAN\r
-TryFinishDORA (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  INTN                OfferIx\r
-  )\r
-{\r
-  DHCP_RECEIVE_BUFFER *DhcpRxBuf;\r
-  EFI_IP_ADDRESS      ClientIp;\r
-  EFI_IP_ADDRESS      ServerIp;\r
-  EFI_STATUS          StatCode;\r
-  UNION_PTR           LocalPtr;\r
-  EFI_EVENT           TimeoutEvent;\r
-\r
-  //\r
-  // send DHCP request\r
-  // if fail return false\r
-  //\r
-  DhcpRxBuf = &DHCPV4_ACK_BUFFER;\r
-  DHCPV4_OPTIONS_BUFFER.DhcpMessageType.Type  = DHCPREQUEST;\r
-  CopyMem (&DHCP_REQ_OPTIONS, &RequestOpEndStr, sizeof (DHCP_REQ_OPTIONS));\r
-  DHCP_REQ_OPTIONS.OpReqIP.Ip = *(EFI_IPv4_ADDRESS *) &RxBuf[OfferIx].u.Dhcpv4.yiaddr;\r
-\r
-  CopyMem (\r
-    &DHCP_REQ_OPTIONS.DhcServerIpPtr.Ip,\r
-    &((DHCPV4_OP_SERVER_IP *) RxBuf[OfferIx].OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1])->Ip,\r
-    sizeof DHCP_REQ_OPTIONS.DhcServerIpPtr.Ip\r
-    );\r
-\r
-  CopyMem (\r
-    Private->EfiBc.Mode->SubnetMask.Addr,\r
-    &DefaultSubnetMask,\r
-    4\r
-    );\r
-\r
-  //\r
-  // broadcast DHCPREQUEST\r
-  //\r
-  if (DoUdpWrite (\r
-        Private,\r
-        &BroadcastIP,\r
-        &DhcpServerPort,\r
-        (EFI_IP_ADDRESS *) &DHCPV4_TRANSMIT_BUFFER.ciaddr,\r
-        &DHCPClientPort\r
-        ) != EFI_SUCCESS) {\r
-    return FALSE;\r
-  }\r
-  //\r
-  //\r
-  //\r
-  StatCode = gBS->CreateEvent (\r
-                    EVT_TIMER,\r
-                    TPL_CALLBACK,\r
-                    NULL,\r
-                    NULL,\r
-                    &TimeoutEvent\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    return FALSE;\r
-  }\r
-\r
-  StatCode = gBS->SetTimer (\r
-                    TimeoutEvent,\r
-                    TimerPeriodic,\r
-                    Private->Timeout * 10000000 + 1000000\r
-                    );\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return FALSE;\r
-  }\r
-  //\r
-  // wait for ACK\r
-  //\r
-  for (;;) {\r
-    if (GetOfferAck (\r
-          Private,\r
-          DHCPAckEdit,\r
-          EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP | EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP,\r
-          &ServerIp,\r
-          &DhcpServerPort,\r
-          &ClientIp,\r
-          &DHCPClientPort,\r
-          DhcpRxBuf,\r
-          TimeoutEvent\r
-          ) != EFI_SUCCESS) {\r
-      break;\r
-    }\r
-    //\r
-    // check type of response - need DHCPACK\r
-    //\r
-    if (CompareMem (\r
-          &DHCP_REQ_OPTIONS.OpReqIP.Ip,\r
-          &DhcpRxBuf->u.Dhcpv4.yiaddr,\r
-          sizeof (EFI_IPv4_ADDRESS)\r
-          ) || CompareMem (\r
-          &DHCP_REQ_OPTIONS.DhcServerIpPtr.Ip,\r
-          &((DHCPV4_OP_SERVER_IP *) DhcpRxBuf->OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1])->Ip,\r
-          sizeof (EFI_IPv4_ADDRESS)\r
-          )) {\r
-      continue;\r
-    }\r
-    //\r
-    // got ACK\r
-    // check with ARP that IP unused - good return true\r
-    //\r
-    if (!SetStationIP (Private)) {\r
-      //\r
-      // fail - send DHCPDECLINE and return false\r
-      //\r
-      DeclineOffer (Private);\r
-      break;\r
-    }\r
-\r
-    LocalPtr.OpPtr = DHCPV4_ACK_BUFFER.OpAdds.PktOptAdds[OP_SUBNET_MASK_IX - 1];\r
-\r
-    if (LocalPtr.OpPtr != NULL) {\r
-      CopyMem (\r
-        (EFI_IPv4_ADDRESS *) &Private->EfiBc.Mode->SubnetMask,\r
-        &LocalPtr.SubnetMaskStr->Ip,\r
-        sizeof (EFI_IPv4_ADDRESS)\r
-        );\r
-    }\r
-\r
-    AddRouters (Private, DhcpRxBuf);\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return TRUE;\r
-  }\r
-\r
-  gBS->CloseEvent (TimeoutEvent);\r
-  return FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// try a DHCP server of appropriate type\r
-//\r
-BOOLEAN\r
-TryDHCPFinishDORA (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  INTN                TypeIx\r
-  )\r
-{\r
-  INTN  Index;\r
-\r
-  //\r
-  // go through the DHCP servers of the requested type\r
-  //\r
-  for (Index = 0; Index < Private->ServerCount[TypeIx]; ++Index) {\r
-    if (TryFinishDORA (Private, Index = Private->OfferCount[TypeIx][Index])) {\r
-      if (TypeIx == BINL_IX && !TryFinishBINL (Private, Index)) {\r
-        continue;\r
-      }\r
-\r
-      return TRUE;\r
-    }\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// try a DHCP only server and a proxy of appropriate type\r
-//\r
-BOOLEAN\r
-TryProxyFinishDORA (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  INTN                TypeIx\r
-  )\r
-{\r
-  INTN  Index;\r
-\r
-  if (!Private->GotProxy[TypeIx]) {\r
-    //\r
-    // no proxies of the type wanted\r
-    //\r
-    return FALSE;\r
-  }\r
-  //\r
-  // go through the DHCP only servers\r
-  //\r
-  for (Index = 0; Index < Private->ServerCount[DHCP_ONLY_IX]; ++Index) {\r
-    if (TryFinishDORA (Private, Private->OfferCount[DHCP_ONLY_IX][Index])) {\r
-      if (TypeIx != BINL_IX) {\r
-        CopyProxyRxBuf (Private, Private->GotProxy[TypeIx] - 1);\r
-      } else if (!TryFinishProxyBINL (Private)) {\r
-        //\r
-        // if didn't work with this DHCP, won't work with any\r
-        //\r
-        return FALSE;\r
-      }\r
-\r
-      return TRUE;\r
-    }\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// getting to the bottom of the barrel\r
-//\r
-BOOLEAN\r
-TryAnyWithBootfileFinishDORA (\r
-  PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  //\r
-  // try a DHCP only server who has a bootfile\r
-  //\r
-  UNION_PTR LocalPtr;\r
-  INTN      Index;\r
-\r
-  for (Index = 0; Index < Private->ServerCount[DHCP_ONLY_IX]; ++Index) {\r
-    INTN  offer;\r
-\r
-    offer = Private->OfferCount[DHCP_ONLY_IX][Index];\r
-\r
-    if (RxBuf[offer].OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1] && TryFinishDORA (Private, offer)) {\r
-      return TRUE;\r
-    }\r
-  }\r
-  //\r
-  // really at bottom - see if be have any bootps\r
-  //\r
-  if (!Private->GotBootp) {\r
-    return FALSE;\r
-  }\r
-\r
-  DHCP_REQ_OPTIONS.OpReqIP.Ip = *(EFI_IPv4_ADDRESS *) &RxBuf[Private->GotBootp - 1].u.Dhcpv4.yiaddr;\r
-\r
-  if (!SetStationIP (Private)) {\r
-    return FALSE;\r
-  }\r
-  //\r
-  // treat BOOTP response as DHCP ACK packet\r
-  //\r
-  CopyParseRxBuf (Private, Private->GotBootp - 1, DHCPV4_ACK_INDEX);\r
-\r
-  LocalPtr.OpPtr = RxBuf[Private->GotBootp - 1].OpAdds.PktOptAdds[OP_SUBNET_MASK_IX - 1];\r
-\r
-  if (LocalPtr.OpPtr != NULL) {\r
-    *(EFI_IPv4_ADDRESS *) &Private->EfiBc.Mode->SubnetMask = LocalPtr.SubnetMaskStr->Ip;\r
-  }\r
-\r
-  return TRUE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/* DoDhcpDora()\r
- */\r
-EFI_STATUS\r
-DoDhcpDora (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  BOOLEAN             SortOffers\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_IP_FILTER Filter;\r
-  EFI_STATUS                  StatCode;\r
-  INTN                        NumOffers;\r
-\r
-  Filter.Filters  = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP | EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST;\r
-\r
-  Filter.IpCnt    = 0;\r
-  Filter.reserved = 0;\r
-\r
-  //\r
-  // set filter unicast or broadcast\r
-  //\r
-  if ((StatCode = IpFilter (Private, &Filter)) != EFI_SUCCESS) {\r
-    return StatCode;\r
-  }\r
-  //\r
-  // seed random number with hardware address\r
-  //\r
-  SeedRandom (Private, *(UINT16 *) &Private->SimpleNetwork->Mode->CurrentAddress);\r
-\r
-  for (Private->Timeout = 1;\r
-       Private->Timeout < 17;\r
-       Private->TotalSeconds = (UINT16) (Private->TotalSeconds + Private->Timeout), Private->Timeout <<= 1\r
-      ) {\r
-    INTN  Index;\r
-\r
-    InitDhcpv4TxBuf (Private);\r
-    DHCPV4_TRANSMIT_BUFFER.xid  = Random (Private);\r
-    DHCPV4_TRANSMIT_BUFFER.secs = HTONS (Private->TotalSeconds);\r
-\r
-    //\r
-    // broadcast DHCPDISCOVER\r
-    //\r
-    StatCode = DoUdpWrite (\r
-                Private,\r
-                &BroadcastIP,\r
-                &DhcpServerPort,\r
-                (EFI_IP_ADDRESS *) &DHCPV4_TRANSMIT_BUFFER.ciaddr,\r
-                &DHCPClientPort\r
-                );\r
-\r
-    if (StatCode != EFI_SUCCESS) {\r
-      return StatCode;\r
-    }\r
-\r
-    CopyMem (\r
-      &Private->EfiBc.Mode->DhcpDiscover,\r
-      (EFI_PXE_BASE_CODE_PACKET *) &DHCPV4_TRANSMIT_BUFFER,\r
-      sizeof (EFI_PXE_BASE_CODE_PACKET)\r
-      );\r
-\r
-    //\r
-    // get DHCPOFFER's\r
-    //\r
-    if ((StatCode = GetOffers (Private)) != EFI_SUCCESS) {\r
-      if (StatCode != EFI_NO_RESPONSE) {\r
-        return StatCode;\r
-      }\r
-\r
-      continue;\r
-    }\r
-    //\r
-    // select offer and reply DHCPREQUEST\r
-    //\r
-    if (SortOffers) {\r
-      if (TryDHCPFinishDORA(Private, PXE10_IX) || // try DHCP with PXE10\r
-        TryDHCPFinishDORA(Private, WfM11a_IX)  || // no - try with WfM\r
-        TryProxyFinishDORA(Private, PXE10_IX)  || // no - try DHCP only and proxy with PXE10\r
-        TryProxyFinishDORA(Private, WfM11a_IX) || // no - try DHCP only and proxy with WfM\r
-        TryDHCPFinishDORA(Private, BINL_IX)    || // no - try with WfM\r
-        TryProxyFinishDORA(Private, BINL_IX)   || // no - try DHCP only and proxy with PXE10\r
-        TryAnyWithBootfileFinishDORA(Private))\r
-      {\r
-        return EFI_SUCCESS;\r
-      }\r
-\r
-      continue;\r
-    }\r
-    //\r
-    // FIFO order\r
-    //\r
-    NumOffers = Private->NumOffersReceived;\r
-\r
-    for (Index = 0; Index < NumOffers; ++Index) {\r
-      //\r
-      // ignore proxies\r
-      //\r
-      if (!RxBuf[Index].u.Dhcpv4.yiaddr) {\r
-        continue;\r
-      }\r
-      //\r
-      // check if a bootp server\r
-      //\r
-      if (!RxBuf[Index].OpAdds.PktOptAdds[OP_DHCP_MESSAGE_TYPE_IX - 1]) {\r
-        //\r
-        // it is - just check ARP\r
-        //\r
-        if (!SetStationIP (Private)) {\r
-          continue;\r
-        }\r
-      }\r
-      //\r
-      // else check if a DHCP only server\r
-      //\r
-      else if (!(RxBuf[Index].OpAdds.Status & (DISCOVER_TYPE | WfM11a_TYPE | PXE_TYPE))) {\r
-        //\r
-        // it is a normal DHCP offer (without any PXE options), just finish the D.O.R.A by sending DHCP request.\r
-        //\r
-        if (!TryFinishDORA (Private, Index)) {\r
-          continue;\r
-        }\r
-      } else if (TryFinishDORA (Private, Index)) {\r
-        if (!(RxBuf[Index].OpAdds.Status & (DISCOVER_TYPE | WfM11a_TYPE)) && !TryFinishBINL (Private, Index)) {\r
-          continue;\r
-        }\r
-      }\r
-\r
-      DEBUG ((DEBUG_WARN, "\nDoDhcpDora()  Got packets.  "));\r
-      return EFI_SUCCESS;\r
-    }\r
-    //\r
-    // now look for DHCP onlys and a Proxy\r
-    //\r
-    for (Index = 0; Index < NumOffers; ++Index) {\r
-      INTN  Index2;\r
-\r
-      //\r
-      // ignore proxies, bootps, non DHCP onlys, and bootable DHCPS\r
-      //\r
-      if (!RxBuf[Index].u.Dhcpv4.yiaddr ||\r
-          !RxBuf[Index].OpAdds.PktOptAdds[OP_DHCP_MESSAGE_TYPE_IX - 1] ||\r
-          RxBuf[Index].OpAdds.Status & (DISCOVER_TYPE | WfM11a_TYPE | PXE_TYPE) ||\r
-          RxBuf[Index].OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1]\r
-          ) {\r
-        continue;\r
-      }\r
-      //\r
-      // found non bootable DHCP only - try to find a proxy\r
-      //\r
-      for (Index2 = 0; Index2 < NumOffers; ++Index2) {\r
-        if (!RxBuf[Index2].u.Dhcpv4.yiaddr) {\r
-          if (!TryFinishDORA (Private, Index)) {\r
-            //\r
-            // DHCP no ACK\r
-            //\r
-            break;\r
-          }\r
-\r
-          if (RxBuf[Index2].OpAdds.Status & (DISCOVER_TYPE | WfM11a_TYPE)) {\r
-            CopyProxyRxBuf (Private, Index2);\r
-          } else if (!TryFinishBINL (Private, Index2)) {\r
-            continue;\r
-          }\r
-\r
-          DEBUG ((DEBUG_WARN, "\nDoDhcpDora()  Got packets.  "));\r
-          return EFI_SUCCESS;\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  return EFI_NO_RESPONSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// determine if the server ip is in the ip list\r
-//\r
-BOOLEAN\r
-InServerList (\r
-  EFI_IP_ADDRESS    *ServerIpPtr,\r
-  PXE_SERVER_LISTS  *ServerListPtr\r
-  )\r
-{\r
-  UINTN Index;\r
-\r
-  if (!ServerListPtr || !ServerListPtr->Ipv4List.IpCount) {\r
-    return TRUE;\r
-  }\r
-\r
-  for (Index = 0; Index < ServerListPtr->Ipv4List.IpCount; ++Index) {\r
-    if (!CompareMem (\r
-          ServerIpPtr,\r
-          &ServerListPtr->Ipv4List.IpList[Index],\r
-          sizeof (EFI_IPv4_ADDRESS)\r
-          )) {\r
-      return TRUE;\r
-    }\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-BOOLEAN\r
-ExtractBootServerList (\r
-  UINT16            Type,\r
-  DHCPV4_OP_STRUCT  *ptr,\r
-  PXE_SERVER_LISTS  **ServerListPtr\r
-  )\r
-{\r
-  UNION_PTR LocalPtr;\r
-  INTN      ServerListLen;\r
-\r
-  LocalPtr.OpPtr  = ptr;\r
-  ServerListLen   = LocalPtr.BootServersStr->Header.Length;\r
-\r
-  //\r
-  // find type\r
-  //\r
-  LocalPtr.BootServerList = LocalPtr.BootServersStr->ServerList;\r
-\r
-  while (ServerListLen) {\r
-    INTN  ServerEntryLen;\r
-\r
-    ServerEntryLen = sizeof (PXEV4_SERVER_LIST) + 2 + (LocalPtr.BootServerList->u.Ipv4List.IpCount - 1) *\r
-    sizeof (EFI_IPv4_ADDRESS);\r
-\r
-    if (NTOHS (LocalPtr.BootServerList->Type) == Type) {\r
-      *ServerListPtr = &LocalPtr.BootServerList->u;\r
-      return TRUE;\r
-    }\r
-\r
-    (LocalPtr.BytePtr) += ServerEntryLen;\r
-    ServerListLen -= ServerEntryLen;\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-FreeMem (\r
-  PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  if (Private->TransmitBuffer != NULL) {\r
-    gBS->FreePool (Private->TransmitBuffer);\r
-    Private->TransmitBuffer = NULL;\r
-  }\r
-\r
-  if (Private->ReceiveBuffers != NULL) {\r
-    gBS->FreePool (Private->ReceiveBuffers);\r
-    Private->ReceiveBuffers = NULL;\r
-  }\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-BOOLEAN\r
-GetMem (\r
-  PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-\r
-  if (Private->DhcpPacketBuffer == NULL) {\r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    sizeof (DHCP_RECEIVE_BUFFER) * (PXE_BIS_INDEX + 1),\r
-                    &Private->DhcpPacketBuffer\r
-                    );\r
-\r
-    if (EFI_ERROR (Status) || Private->DhcpPacketBuffer == NULL) {\r
-      Private->DhcpPacketBuffer = NULL;\r
-      FreeMem (Private);\r
-      return FALSE;\r
-    }\r
-  }\r
-\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  sizeof (EFI_PXE_BASE_CODE_PACKET),\r
-                  &Private->TransmitBuffer\r
-                  );\r
-\r
-  if (EFI_ERROR (Status) || Private->TransmitBuffer == NULL) {\r
-    gBS->FreePool (Private->DhcpPacketBuffer);\r
-    Private->DhcpPacketBuffer = NULL;\r
-    Private->TransmitBuffer   = NULL;\r
-    FreeMem (Private);\r
-    return FALSE;\r
-  }\r
-\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  sizeof (DHCP_RECEIVE_BUFFER) * (MAX_OFFERS),\r
-                  &Private->ReceiveBuffers\r
-                  );\r
-\r
-  if (EFI_ERROR (Status) || Private->ReceiveBuffers == NULL) {\r
-    gBS->FreePool (Private->TransmitBuffer);\r
-    gBS->FreePool (Private->DhcpPacketBuffer);\r
-    Private->DhcpPacketBuffer = NULL;\r
-    Private->TransmitBuffer   = NULL;\r
-    Private->ReceiveBuffers   = NULL;\r
-    FreeMem (Private);\r
-    return FALSE;\r
-  }\r
-\r
-  return TRUE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcDhcp (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL *This,\r
-  IN BOOLEAN                    SortOffers\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_IP_FILTER Filter;\r
-  EFI_PXE_BASE_CODE_MODE      *PxebcMode;\r
-  PXE_BASECODE_DEVICE         *Private;\r
-  EFI_STATUS                  StatCode;\r
-\r
-  //\r
-  // Lock the instance data and make sure started\r
-  //\r
-  StatCode = EFI_SUCCESS;\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  if (This->Mode == NULL || !This->Mode->Started) {\r
-    DEBUG ((DEBUG_ERROR, "BC was not started."));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  Filter.Filters  = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;\r
-  Filter.IpCnt    = 0;\r
-  Filter.reserved = 0;\r
-\r
-  DEBUG ((DEBUG_INFO, "\nBcDhcp()  Enter.  "));\r
-\r
-  PxebcMode = Private->EfiBc.Mode;\r
-\r
-  if (!GetMem (Private)) {\r
-    DEBUG ((DEBUG_ERROR, "\nBcDhcp()  GetMem() failed.\n"));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  PxebcMode->DhcpDiscoverValid = FALSE;\r
-  PxebcMode->DhcpAckReceived = FALSE;\r
-  PxebcMode->ProxyOfferReceived = FALSE;\r
-\r
-  Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DHCP;\r
-\r
-  //\r
-  // Issue BC command\r
-  //\r
-  if (Private->TotalSeconds == 0) {\r
-    //\r
-    // put in seconds field of DHCP send packets\r
-    //\r
-    Private->TotalSeconds = 4;\r
-  }\r
-\r
-  if ((StatCode = DoDhcpDora (Private, SortOffers)) == EFI_SUCCESS) {\r
-    //\r
-    // success - copy packets\r
-    //\r
-    PxebcMode->DhcpDiscoverValid = PxebcMode->DhcpAckReceived = TRUE;\r
-\r
-    CopyMem (\r
-      &PxebcMode->DhcpAck,\r
-      (EFI_PXE_BASE_CODE_PACKET *) &DHCPV4_ACK_PACKET,\r
-      sizeof (EFI_PXE_BASE_CODE_PACKET)\r
-      );\r
-\r
-    if (PxebcMode->ProxyOfferReceived) {\r
-      CopyMem (\r
-        &PxebcMode->ProxyOffer,\r
-        (EFI_PXE_BASE_CODE_PACKET *) &PXE_OFFER_PACKET,\r
-        sizeof (EFI_PXE_BASE_CODE_PACKET)\r
-        );\r
-    }\r
-  }\r
-  //\r
-  // set filter back to unicast\r
-  //\r
-  IpFilter (Private, &Filter);\r
-\r
-  FreeMem (Private);\r
-\r
-  //\r
-  // Unlock the instance data\r
-  //\r
-  DEBUG ((DEBUG_WARN, "\nBcDhcp()  Exit = %xh  ", StatCode));\r
-\r
-  EfiReleaseLock (&Private->Lock);\r
-  return StatCode;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-BOOLEAN\r
-VerifyCredentialOption (\r
-  UINT8 *tx,\r
-  UINT8 *rx\r
-  )\r
-{\r
-  UINTN n;\r
-\r
-  //\r
-  // Fail verification if either pointer is NULL.\r
-  //\r
-  if (tx == NULL || rx == NULL) {\r
-    return FALSE;\r
-  }\r
-  //\r
-  // Fail verification if tx[0] is not a credential type option\r
-  // or if the length is zero or not a multiple of four.\r
-  //\r
-  if (tx[0] != VEND_PXE_CREDENTIAL_TYPES || tx[1] == 0 || tx[1] % 4 != 0) {\r
-    return FALSE;\r
-  }\r
-  //\r
-  // Fail verification if rx[0] is not a credential type option\r
-  // or if the length is not equal to four.\r
-  //\r
-  if (rx[0] != VEND_PXE_CREDENTIAL_TYPES || rx[1] != 4) {\r
-    return FALSE;\r
-  }\r
-  //\r
-  // Look through transmitted credential types for a copy\r
-  // of the received credential type.\r
-  //\r
-  for (n = 0; n < tx[1]; n += 4) {\r
-    if (!CompareMem (&tx[n + 2], &rx[2], 4)) {\r
-      return TRUE;\r
-    }\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-DoDiscover (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  UINT16              OpFlags,\r
-  IN UINT16           Type,\r
-  IN UINT16           *LayerPtr,\r
-  IN BOOLEAN          UseBis,\r
-  EFI_IP_ADDRESS      *DestPtr,\r
-  PXE_SERVER_LISTS    *ServerListPtr\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_UDP_PORT  ClientPort;\r
-  EFI_PXE_BASE_CODE_UDP_PORT  ServerPort;\r
-  EFI_PXE_BASE_CODE_MODE      *PxebcMode;\r
-  EFI_STATUS                  StatCode;\r
-  EFI_EVENT                   TimeoutEvent;\r
-  UINT8                       OpLen;\r
-\r
-  PxebcMode = Private->EfiBc.Mode;\r
-\r
-  if (DestPtr->Addr[0] == 0) {\r
-    DEBUG ((DEBUG_WARN, "\nDoDiscover()  !DestPtr->Addr[0]"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // seed random number with hardware address\r
-  //\r
-  SeedRandom (Private, *(UINT16 *) &Private->SimpleNetwork->Mode->CurrentAddress);\r
-\r
-  if (DestPtr->Addr[0] == BroadcastIP.Addr[0]) {\r
-    ClientPort  = DHCPClientPort;\r
-    ServerPort  = DhcpServerPort;\r
-  } else {\r
-    ClientPort  = PSEUDO_DHCP_CLIENT_PORT;\r
-    ServerPort  = PseudoDhcpServerPort;\r
-  }\r
-\r
-  if (UseBis) {\r
-    *LayerPtr |= PXE_BOOT_LAYER_CREDENTIAL_FLAG;\r
-  } else {\r
-    *LayerPtr &= PXE_BOOT_LAYER_MASK;\r
-  }\r
-\r
-  for (Private->Timeout = 1;\r
-       Private->Timeout < 5;\r
-       Private->TotalSeconds = (UINT16) (Private->TotalSeconds + Private->Timeout), ++Private->Timeout\r
-      ) {\r
-    InitDhcpv4TxBuf (Private);\r
-    //\r
-    // initialize DHCP message structure\r
-    //\r
-    DHCPV4_TRANSMIT_BUFFER.xid  = Random (Private);\r
-    DHCPV4_TRANSMIT_BUFFER.secs = HTONS (Private->TotalSeconds);\r
-    CopyMem (\r
-      &DHCPV4_TRANSMIT_BUFFER.ciaddr,\r
-      &PxebcMode->StationIp,\r
-      sizeof DHCPV4_TRANSMIT_BUFFER.ciaddr\r
-      );\r
-\r
-    DHCPV4_OPTIONS_BUFFER.DhcpMessageType.Type  = DHCPREQUEST;\r
-    DISCOVERoptions.Header.OpCode               = OP_VENDOR_SPECIFIC;\r
-    DISCOVERoptions.BootItem.Header.OpCode      = VEND_PXE_BOOT_ITEM;\r
-    DISCOVERoptions.BootItem.Header.Length      = DHCPV4_OPTION_LENGTH (PXE_OP_BOOT_ITEM);\r
-    DISCOVERoptions.BootItem.Type               = HTONS (Type);\r
-    DISCOVERoptions.BootItem.Layer              = HTONS (*LayerPtr);\r
-\r
-    if (UseBis) {\r
-      EFI_BIS_PROTOCOL        *BisPtr;\r
-      BIS_APPLICATION_HANDLE  BisAppHandle;\r
-      EFI_BIS_DATA            *BisDataSigInfo;\r
-      EFI_BIS_SIGNATURE_INFO  *BisSigInfo;\r
-      UINTN                   Index;\r
-      UINTN                   Index2;\r
-\r
-      BisPtr = PxebcBisStart (\r
-                Private,\r
-                &BisAppHandle,\r
-                &BisDataSigInfo\r
-                );\r
-\r
-      if (BisPtr == NULL) {\r
-        //\r
-        // %%TBD - In order to get here, BIS must have\r
-        // been present when PXEBC.Start() was called.\r
-        // BIS had to be shutdown/removed/damaged\r
-        // before PXEBC.Discover() was called.\r
-        // Do we need to document a specific error\r
-        // for this case?\r
-        //\r
-        return EFI_OUT_OF_RESOURCES;\r
-      }\r
-      //\r
-      // Compute number of credential types.\r
-      //\r
-      Index2                        = BisDataSigInfo->Length / sizeof (EFI_BIS_SIGNATURE_INFO);\r
-\r
-      DISCREDoptions.Header.OpCode  = VEND_PXE_CREDENTIAL_TYPES;\r
-\r
-      DISCREDoptions.Header.Length  = (UINT8) (Index2 * sizeof (PXE_CREDENTIAL));\r
-\r
-      OpLen = (UINT8) (DHCPV4_OPTION_LENGTH (PXE_DISCOVER_OPTIONS) + sizeof (DHCPV4_OP_HEADER) + DISCREDoptions.Header.Length);\r
-\r
-      BisSigInfo = (EFI_BIS_SIGNATURE_INFO *) BisDataSigInfo->Data;\r
-\r
-      for (Index = 0; Index < Index2; ++Index) {\r
-        UINT32  x;\r
-\r
-        CopyMem (&x, &BisSigInfo[Index], sizeof x);\r
-        x = HTONL (x);\r
-        CopyMem (&DISCREDoptions.Credentials[Index], &x, sizeof x);\r
-      }\r
-\r
-      PxebcBisStop (BisPtr, BisAppHandle, BisDataSigInfo);\r
-    } else {\r
-      OpLen = DHCPV4_OPTION_LENGTH (PXE_DISCOVER_OPTIONS);\r
-    }\r
-\r
-    DISCOVERoptions.Header.Length = OpLen;\r
-\r
-    ((UINT8 *) &DISCOVERoptions)[sizeof (DHCPV4_OP_HEADER) + OpLen - 1] = OP_END;\r
-    ((UINT8 *) &DISCOVERoptions)[sizeof (DHCPV4_OP_HEADER) + OpLen]     = OP_END;\r
-\r
-    StatCode = DoUdpWrite (\r
-                Private,\r
-                DestPtr,\r
-                &ServerPort,\r
-                (EFI_IP_ADDRESS *) &DHCPV4_TRANSMIT_BUFFER.ciaddr,\r
-                &ClientPort\r
-                );\r
-\r
-    if (StatCode != EFI_SUCCESS) {\r
-      return StatCode;\r
-    }\r
-    //\r
-    //\r
-    //\r
-    StatCode = gBS->CreateEvent (\r
-                      EVT_TIMER,\r
-                      TPL_CALLBACK,\r
-                      NULL,\r
-                      NULL,\r
-                      &TimeoutEvent\r
-                      );\r
-\r
-    if (EFI_ERROR (StatCode)) {\r
-      return StatCode;\r
-    }\r
-\r
-    StatCode = gBS->SetTimer (\r
-                      TimeoutEvent,\r
-                      TimerRelative,\r
-                      Private->Timeout * 10000000 + 1000000\r
-                      );\r
-\r
-    if (EFI_ERROR (StatCode)) {\r
-      gBS->CloseEvent (TimeoutEvent);\r
-      return StatCode;\r
-    }\r
-    //\r
-    // wait for ACK\r
-    //\r
-    for (;;) {\r
-      DHCP_RECEIVE_BUFFER *RxBufPtr;\r
-      UINT16              TmpType;\r
-      UINT16              TmpLayer;\r
-\r
-      RxBufPtr = UseBis ? &PXE_BIS_BUFFER : &PXE_ACK_BUFFER;\r
-      ZeroMem (&Private->ServerIp, sizeof (EFI_IP_ADDRESS));\r
-\r
-      if (GetOfferAck (\r
-            Private,\r
-            AckEdit,\r
-            OpFlags,\r
-            (EFI_IP_ADDRESS *) &Private->ServerIp,\r
-            0,\r
-            (EFI_IP_ADDRESS *) &DHCPV4_TRANSMIT_BUFFER.ciaddr,\r
-            &ClientPort,\r
-            RxBufPtr,\r
-            TimeoutEvent\r
-            ) != EFI_SUCCESS) {\r
-        break;\r
-      }\r
-      //\r
-      // check type of response - need PXEClient DHCPACK of proper type with bootfile\r
-      //\r
-      if (!(RxBufPtr->OpAdds.Status & PXE_TYPE) ||\r
-          (UseBis && (RxBufPtr->OpAdds.Status & USE_THREE_BYTE)) ||\r
-          !RxBufPtr->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1] ||\r
-          !RxBufPtr->OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1] ||\r
-          !InServerList((EFI_IP_ADDRESS *)&((DHCPV4_OP_SERVER_IP *)RxBufPtr->OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX-1])->Ip, ServerListPtr)) {\r
-\r
-        continue;\r
-      }\r
-\r
-      TmpType = TmpLayer = 0;\r
-\r
-      if (RxBufPtr->OpAdds.PxeOptAdds[VEND_PXE_BOOT_ITEM_IX - 1]) {\r
-        TmpType = NTOHS (((PXE_OP_BOOT_ITEM *) RxBufPtr->OpAdds.PxeOptAdds[VEND_PXE_BOOT_ITEM_IX - 1])->Type);\r
-\r
-        if (RxBufPtr->OpAdds.Status & USE_THREE_BYTE) {\r
-          TmpLayer = (UINT16) (((PXE_OP_BOOT_ITEM *) RxBufPtr->OpAdds.PxeOptAdds[VEND_PXE_BOOT_ITEM_IX - 1])->Layer >> 8);\r
-        } else {\r
-          TmpLayer = NTOHS (((PXE_OP_BOOT_ITEM *) RxBufPtr->OpAdds.PxeOptAdds[VEND_PXE_BOOT_ITEM_IX - 1])->Layer);\r
-        }\r
-      }\r
-\r
-      if (TmpType != Type) {\r
-        continue;\r
-      }\r
-\r
-      if (UseBis) {\r
-        if (!RxBufPtr->OpAdds.PxeOptAdds[VEND_PXE_CREDENTIAL_TYPES_IX - 1]) {\r
-          continue;\r
-        }\r
-\r
-        if (!VerifyCredentialOption (\r
-              (UINT8 *) &DISCREDoptions.Header,\r
-              (UINT8 *) RxBufPtr->OpAdds.PxeOptAdds[VEND_PXE_CREDENTIAL_TYPES_IX - 1]\r
-              )) {\r
-          continue;\r
-        }\r
-      }\r
-\r
-      *LayerPtr = TmpLayer;\r
-\r
-      if (UseBis) {\r
-        CopyMem (\r
-          &PxebcMode->PxeBisReply,\r
-          &RxBufPtr->u.Dhcpv4,\r
-          sizeof (EFI_PXE_BASE_CODE_PACKET)\r
-          );\r
-\r
-        PxebcMode->PxeBisReplyReceived = TRUE;\r
-\r
-        StatCode = DoDiscover (\r
-                    Private,\r
-                    EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT,\r
-                    Type,\r
-                    LayerPtr,\r
-                    FALSE,\r
-                    &Private->ServerIp,\r
-                    0\r
-                    );\r
-\r
-        gBS->CloseEvent (TimeoutEvent);\r
-        return StatCode;\r
-      }\r
-\r
-      PxebcMode->PxeDiscoverValid = PxebcMode->PxeReplyReceived = TRUE;\r
-\r
-      CopyMem (\r
-        &PxebcMode->PxeDiscover,\r
-        &*(EFI_PXE_BASE_CODE_PACKET *) &DHCPV4_TRANSMIT_BUFFER,\r
-        sizeof (*(EFI_PXE_BASE_CODE_PACKET *) &DHCPV4_TRANSMIT_BUFFER)\r
-        );\r
-\r
-      CopyMem (\r
-        &PxebcMode->PxeReply,\r
-        &*(EFI_PXE_BASE_CODE_PACKET *) &RxBufPtr->u.Dhcpv4,\r
-        sizeof (*(EFI_PXE_BASE_CODE_PACKET *) &RxBufPtr->u.Dhcpv4)\r
-        );\r
-\r
-      AddRouters (Private, RxBufPtr);\r
-\r
-      gBS->CloseEvent (TimeoutEvent);\r
-      return EFI_SUCCESS;\r
-    }\r
-\r
-    gBS->CloseEvent (TimeoutEvent);\r
-  }\r
-  //\r
-  // end for loop\r
-  //\r
-  return EFI_TIMEOUT;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-  Parameters:\r
-  Private := Pointer to PxeBc interface\r
-  Type :=\r
-  LayerPtr :=\r
-  UseBis :=\r
-  DiscoverInfoPtr :=\r
-  McastServerListPtr :=\r
-  ServerListPtr :=\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-Discover (\r
-  PXE_BASECODE_DEVICE                 *Private,\r
-  IN UINT16                           Type,\r
-  IN UINT16                           *LayerPtr,\r
-  IN BOOLEAN                          UseBis,\r
-  IN EFI_PXE_BASE_CODE_DISCOVER_INFO  *DiscoverInfoPtr,\r
-  PXE_SERVER_LISTS                    *McastServerListPtr,\r
-  PXE_SERVER_LISTS                    *ServerListPtr\r
-  )\r
-{\r
-  EFI_IP_ADDRESS  DestIp;\r
-  EFI_STATUS      StatCode;\r
-\r
-  DEBUG ((DEBUG_INFO, "\nDiscover()  Type=%d  Layer=%d  ", Type, *LayerPtr));\r
-\r
-  if (UseBis) {\r
-    DEBUG ((DEBUG_INFO, "BIS  "));\r
-  }\r
-  //\r
-  // get dest IP addr - mcast, bcast, or unicast\r
-  //\r
-  if (DiscoverInfoPtr->UseMCast) {\r
-    DestIp.v4 = DiscoverInfoPtr->ServerMCastIp.v4;\r
-\r
-    DEBUG (\r
-      (DEBUG_INFO,\r
-      "\nDiscover()  MCast %d.%d.%d.%d  ",\r
-      DestIp.v4.Addr[0],\r
-      DestIp.v4.Addr[1],\r
-      DestIp.v4.Addr[2],\r
-      DestIp.v4.Addr[3])\r
-      );\r
-\r
-    if ((StatCode = DoDiscover (\r
-                      Private,\r
-                      EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP | EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT,\r
-                      Type,\r
-                      LayerPtr,\r
-                      UseBis,\r
-                      &DestIp,\r
-                      McastServerListPtr\r
-                      )) != EFI_TIMEOUT) {\r
-      DEBUG (\r
-        (DEBUG_WARN,\r
-        "\nDiscover()  status == %r (%Xh)",\r
-        StatCode,\r
-        StatCode)\r
-        );\r
-\r
-      return StatCode;\r
-    }\r
-  }\r
-\r
-  if (DiscoverInfoPtr->UseBCast) {\r
-    DEBUG ((DEBUG_INFO, "\nDiscver()  BCast  "));\r
-\r
-    if ((StatCode = DoDiscover (\r
-                      Private,\r
-                      EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP | EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT,\r
-                      Type,\r
-                      LayerPtr,\r
-                      UseBis,\r
-                      &BroadcastIP,\r
-                      McastServerListPtr\r
-                      )) != EFI_TIMEOUT) {\r
-\r
-      DEBUG ((DEBUG_WARN, "\nDiscover()  status == %r (%Xh)", StatCode, StatCode));\r
-\r
-      return StatCode;\r
-    }\r
-  }\r
-\r
-  if (DiscoverInfoPtr->UseUCast) {\r
-    UINTN Index;\r
-\r
-    DEBUG (\r
-      (DEBUG_INFO,\r
-      "\nDiscover()  UCast  IP#=%d  ",\r
-      ServerListPtr->Ipv4List.IpCount)\r
-      );\r
-\r
-    for (Index = 0; Index < ServerListPtr->Ipv4List.IpCount; ++Index) {\r
-      CopyMem (&DestIp, &ServerListPtr->Ipv4List.IpList[Index], 4);\r
-\r
-      DEBUG (\r
-        (DEBUG_INFO,\r
-        "\nDiscover()  UCast %d.%d.%d.%d  ",\r
-        DestIp.v4.Addr[0],\r
-        DestIp.v4.Addr[1],\r
-        DestIp.v4.Addr[2],\r
-        DestIp.v4.Addr[3])\r
-        );\r
-\r
-      if ((StatCode = DoDiscover (\r
-                        Private,\r
-                        EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP | EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT,\r
-                        Type,\r
-                        LayerPtr,\r
-                        UseBis,\r
-                        &DestIp,\r
-                        0\r
-                        )) != EFI_TIMEOUT) {\r
-        DEBUG (\r
-          (DEBUG_WARN,\r
-          "\nDiscover()  status == %r (%Xh)",\r
-          StatCode,\r
-          StatCode)\r
-          );\r
-\r
-        return StatCode;\r
-      }\r
-    }\r
-  }\r
-\r
-  DEBUG ((DEBUG_WARN, "\nDiscover()  TIMEOUT"));\r
-\r
-  return EFI_TIMEOUT;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/* BcDiscover()\r
- */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcDiscover (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
-  IN UINT16                           Type,\r
-  IN UINT16                           *LayerPtr,\r
-  IN BOOLEAN                          UseBis,\r
-  IN EFI_PXE_BASE_CODE_DISCOVER_INFO  * DiscoverInfoPtr OPTIONAL\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_DISCOVER_INFO DefaultInfo;\r
-  EFI_PXE_BASE_CODE_MODE          *PxebcMode;\r
-  DHCP_RECEIVE_BUFFER             *DhcpRxBuf;\r
-  PXE_SERVER_LISTS                DefaultSrvList;\r
-  PXE_SERVER_LISTS                *ServerListPtr;\r
-  PXE_SERVER_LISTS                *McastServerListPtr;\r
-  UNION_PTR                       LocalPtr;\r
-  UINTN                           Index;\r
-  UINTN                           Index2;\r
-  BOOLEAN                         AcquiredSrvList;\r
-  EFI_STATUS                      StatCode;\r
-  PXE_BASECODE_DEVICE             *Private;\r
-\r
-  //\r
-  // Lock the instance data and make sure started\r
-  //\r
-  StatCode = EFI_SUCCESS;\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE poiner == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  if (This->Mode == NULL || !This->Mode->Started) {\r
-    DEBUG ((DEBUG_ERROR, "BC was not started."));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  ServerListPtr       = NULL;\r
-  McastServerListPtr  = NULL;\r
-  AcquiredSrvList     = FALSE;\r
-\r
-  PxebcMode           = Private->EfiBc.Mode;\r
-\r
-  if (!GetMem (Private)) {\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  if (UseBis) {\r
-    if (!PxebcMode->BisSupported) {\r
-      EfiReleaseLock (&Private->Lock);\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-  }\r
-\r
-  Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DISCOVER;\r
-\r
-  if (Private->TotalSeconds == 0) {\r
-    //\r
-    // put in seconds field of DHCP send packets\r
-    //\r
-    Private->TotalSeconds = 4;\r
-  }\r
-\r
-  ZeroMem (&DefaultInfo, sizeof (EFI_PXE_BASE_CODE_DISCOVER_INFO));\r
-\r
-  //\r
-  // if layer number not zero, use previous discover\r
-  //\r
-  if (*LayerPtr != 0) {\r
-    DEBUG ((DEBUG_WARN, "\nBcDiscover()  layer != 0"));\r
-\r
-    if (DiscoverInfoPtr != NULL) {\r
-      DEBUG ((DEBUG_WARN, "\nBcDiscover()  layer != 0 && DiscoverInfoPtr != NULL\n"));\r
-\r
-      EfiReleaseLock (&Private->Lock);\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    if (!PxebcMode->PxeDiscoverValid) {\r
-      DEBUG ((DEBUG_WARN, "\nBcDiscover()  layer != 0 && PxeDiscoverValid == 0\n"));\r
-\r
-      EfiReleaseLock (&Private->Lock);\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    if (!PxebcMode->PxeReplyReceived) {\r
-      DEBUG ((DEBUG_WARN, "\nBcDiscover()  layer != 0 && PxeReplyReceived == 0\n"));\r
-\r
-      EfiReleaseLock (&Private->Lock);\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    if (UseBis && !PxebcMode->PxeBisReplyReceived) {\r
-      DEBUG ((DEBUG_WARN, "\nBcDiscover()  layer != 0 && PxeBisReplyReceived == 0\n"));\r
-\r
-      EfiReleaseLock (&Private->Lock);\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    DefaultInfo.UseUCast            = TRUE;\r
-    DiscoverInfoPtr                 = &DefaultInfo;\r
-\r
-    DefaultSrvList.Ipv4List.IpCount = 1;\r
-    CopyMem (&DefaultSrvList.Ipv4List.IpList[0], &Private->ServerIp, 4);\r
-\r
-    ServerListPtr = &DefaultSrvList;\r
-  }\r
-  //\r
-  // layer is zero - see if info is supplied or if we need to use info from a cached offer\r
-  //\r
-  else if (!DiscoverInfoPtr) {\r
-    //\r
-    // not supplied - generate it\r
-    // make sure that there is cached, appropriate information\r
-    // if neither DhcpAck packet nor ProxyOffer packet has pxe info, fail\r
-    //\r
-    DhcpRxBuf = (PxebcMode->ProxyOfferReceived) ? &PXE_OFFER_BUFFER : &DHCPV4_ACK_BUFFER;\r
-\r
-    if (!PxebcMode->DhcpAckReceived || !(DhcpRxBuf->OpAdds.Status & DISCOVER_TYPE)) {\r
-      DEBUG ((DEBUG_WARN, "\nBcDiscover()  !ack && !proxy"));\r
-      EfiReleaseLock (&Private->Lock);\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    DiscoverInfoPtr = &DefaultInfo;\r
-\r
-    LocalPtr.OpPtr  = DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_DISCOVERY_CONTROL_IX - 1];\r
-\r
-    //\r
-    // if multicast enabled, need multicast address\r
-    //\r
-    if (!(LocalPtr.DiscoveryControl->ControlBits & DISABLE_MCAST)) {\r
-      DefaultInfo.UseMCast = TRUE;\r
-\r
-      CopyMem (\r
-        ((EFI_IPv4_ADDRESS *) &DefaultInfo.ServerMCastIp),\r
-        &((DHCPV4_OP_IP_ADDRESS *) DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_DISCOVERY_MCAST_ADDR_IX - 1])->Ip,\r
-        sizeof (EFI_IPv4_ADDRESS)\r
-        );\r
-    }\r
-\r
-    DefaultInfo.UseBCast    = (BOOLEAN) ((LocalPtr.DiscoveryControl->ControlBits & DISABLE_BCAST) == 0);\r
-\r
-    DefaultInfo.MustUseList = (BOOLEAN) ((LocalPtr.DiscoveryControl->ControlBits & USE_ACCEPT_LIST) != 0);\r
-\r
-    DefaultInfo.UseUCast = (BOOLEAN)\r
-      (\r
-        (DefaultInfo.MustUseList) ||\r
-        ((LocalPtr.DiscoveryControl->ControlBits & (DISABLE_MCAST | DISABLE_BCAST)) == (DISABLE_MCAST | DISABLE_BCAST))\r
-      );\r
-\r
-    if ((DefaultInfo.UseUCast | DefaultInfo.MustUseList) && !ExtractBootServerList (\r
-                                                              Type,\r
-                                                              DhcpRxBuf->OpAdds.PxeOptAdds[VEND_PXE_BOOT_SERVERS_IX - 1],\r
-                                                              &ServerListPtr\r
-                                                              )) {\r
-      DEBUG ((DEBUG_WARN, "\nBcDiscover()  type not in list"));\r
-      EfiReleaseLock (&Private->Lock);\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-  }\r
-  //\r
-  // Info supplied - make SrvList if required\r
-  // if we use ucast discovery or must use list, there better be one\r
-  //\r
-  else if (DiscoverInfoPtr->UseUCast || DiscoverInfoPtr->MustUseList) {\r
-    //\r
-    // there better be a list\r
-    //\r
-    if (DiscoverInfoPtr->IpCnt == 0) {\r
-      DEBUG ((DEBUG_WARN, "\nBcDiscover()  no bootserver list"));\r
-      EfiReleaseLock (&Private->Lock);\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-    //\r
-    // get its size\r
-    //\r
-    for (Index = Index2 = 0; Index < DiscoverInfoPtr->IpCnt; ++Index) {\r
-      if (DiscoverInfoPtr->SrvList[Index].Type == Type) {\r
-        if (DiscoverInfoPtr->SrvList[Index].AcceptAnyResponse) {\r
-          if (Index2 != 0) {\r
-            DEBUG ((DEBUG_WARN, "\nBcDiscover()  accept any?"));\r
-            EfiReleaseLock (&Private->Lock);\r
-            return EFI_INVALID_PARAMETER;\r
-          } else {\r
-            Index2                          = 1;\r
-            DefaultSrvList.Ipv4List.IpCount = 0;\r
-            ServerListPtr                   = &DefaultSrvList;\r
-            break;\r
-          }\r
-        } else {\r
-          ++Index2;\r
-        }\r
-      }\r
-    }\r
-\r
-    if (Index2 == 0) {\r
-      DEBUG ((DEBUG_WARN, "\nBcDiscover()  !Index2?"));\r
-      EfiReleaseLock (&Private->Lock);\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    if (ServerListPtr == NULL) {\r
-      ServerListPtr = AllocatePool (\r
-                        sizeof (PXEV4_SERVER_LIST) + (Index2 - 1) * sizeof (EFI_IPv4_ADDRESS)\r
-                      );\r
-\r
-      if (ServerListPtr == NULL) {\r
-        EfiReleaseLock (&Private->Lock);\r
-        return EFI_OUT_OF_RESOURCES;\r
-      }\r
-      //\r
-      // build an array of IP addresses from the server list\r
-      //\r
-      AcquiredSrvList                 = TRUE;\r
-      ServerListPtr->Ipv4List.IpCount = (UINT8) Index2;\r
-\r
-      for (Index = Index2 = 0; Index < DiscoverInfoPtr->IpCnt; ++Index) {\r
-        if (DiscoverInfoPtr->SrvList[Index].Type == Type) {\r
-          CopyMem (\r
-            &ServerListPtr->Ipv4List.IpList[Index2++],\r
-            &DiscoverInfoPtr->SrvList[Index].IpAddr.v4,\r
-            sizeof ServerListPtr->Ipv4List.IpList[0]\r
-            );\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  if (DiscoverInfoPtr->MustUseList) {\r
-    McastServerListPtr = ServerListPtr;\r
-  }\r
-\r
-  if (!(DiscoverInfoPtr->UseMCast || DiscoverInfoPtr->UseBCast || DiscoverInfoPtr->UseUCast)) {\r
-    DEBUG ((DEBUG_WARN, "\nBcDiscover()  Nothing to use!\n"));\r
-\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  PxebcMode->PxeDiscoverValid = PxebcMode->PxeReplyReceived = PxebcMode->PxeBisReplyReceived = FALSE;\r
-\r
-  StatCode = Discover (\r
-              Private,\r
-              Type,\r
-              LayerPtr,\r
-              UseBis,\r
-              DiscoverInfoPtr,\r
-              McastServerListPtr,\r
-              ServerListPtr\r
-              );\r
-\r
-  if (AcquiredSrvList) {\r
-    gBS->FreePool (ServerListPtr);\r
-  }\r
-\r
-  FreeMem (Private);\r
-\r
-  //\r
-  // Unlock the instance data\r
-  //\r
-  DEBUG (\r
-    (DEBUG_INFO,\r
-    "\nBcDiscover()  status == %r (%Xh)\n",\r
-    StatCode,\r
-    StatCode)\r
-    );\r
-\r
-  EfiReleaseLock (&Private->Lock);\r
-  return StatCode;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcSetPackets (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL   * This,\r
-  BOOLEAN                         *NewDhcpDiscoverValid, OPTIONAL\r
-  BOOLEAN                         *NewDhcpAckReceived, OPTIONAL\r
-  BOOLEAN                         *NewProxyOfferReceived, OPTIONAL\r
-  BOOLEAN                         *NewPxeDiscoverValid, OPTIONAL\r
-  BOOLEAN                         *NewPxeReplyReceived, OPTIONAL\r
-  BOOLEAN                         *NewPxeBisReplyReceived, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET     * NewDhcpDiscover, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET     * NewDhcpAck, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET     * NewProxyOffer, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET     * NewPxeDiscover, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET     * NewPxeReply, OPTIONAL\r
-  IN EFI_PXE_BASE_CODE_PACKET     * NewPxeBisReply OPTIONAL\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxebcMode;\r
-  EFI_STATUS              Status;\r
-  PXE_BASECODE_DEVICE     *Private;\r
-\r
-  //\r
-  // Lock the instance data and make sure started\r
-  //\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE poiner == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  if (This->Mode == NULL || !This->Mode->Started) {\r
-    DEBUG ((DEBUG_ERROR, "BC was not started."));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  PxebcMode = Private->EfiBc.Mode;\r
-\r
-  if (Private->DhcpPacketBuffer == NULL) {\r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    sizeof (DHCP_RECEIVE_BUFFER) * (PXE_BIS_INDEX + 1),\r
-                    &Private->DhcpPacketBuffer\r
-                    );\r
-\r
-    if (EFI_ERROR (Status) || Private->DhcpPacketBuffer == NULL) {\r
-      Private->DhcpPacketBuffer = NULL;\r
-      EfiReleaseLock (&Private->Lock);\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-  }\r
-  //\r
-  // Issue BC command\r
-  //\r
-  //\r
-  // reset\r
-  //\r
-  Private->FileSize = 0;\r
-  if (NewDhcpDiscoverValid != NULL) {\r
-    PxebcMode->DhcpDiscoverValid = *NewDhcpDiscoverValid;\r
-  }\r
-\r
-  if (NewDhcpAckReceived != NULL) {\r
-    PxebcMode->DhcpAckReceived = *NewDhcpAckReceived;\r
-  }\r
-\r
-  if (NewProxyOfferReceived != NULL) {\r
-    PxebcMode->ProxyOfferReceived = *NewProxyOfferReceived;\r
-  }\r
-\r
-  if (NewPxeDiscoverValid != NULL) {\r
-    PxebcMode->PxeDiscoverValid = *NewPxeDiscoverValid;\r
-  }\r
-\r
-  if (NewPxeReplyReceived != NULL) {\r
-    PxebcMode->PxeReplyReceived = *NewPxeReplyReceived;\r
-  }\r
-\r
-  if (NewPxeBisReplyReceived != NULL) {\r
-    PxebcMode->PxeBisReplyReceived = *NewPxeBisReplyReceived;\r
-  }\r
-\r
-  if (NewDhcpDiscover != NULL) {\r
-    CopyMem (\r
-      &PxebcMode->DhcpDiscover,\r
-      NewDhcpDiscover,\r
-      sizeof *NewDhcpDiscover\r
-      );\r
-  }\r
-\r
-  if (NewDhcpAck != NULL) {\r
-    CopyParse (Private, &PxebcMode->DhcpAck, NewDhcpAck, DHCPV4_ACK_INDEX);\r
-  }\r
-\r
-  if (NewProxyOffer != NULL) {\r
-    CopyParse (Private, &PxebcMode->ProxyOffer, NewProxyOffer, PXE_OFFER_INDEX);\r
-  }\r
-\r
-  if (NewPxeDiscover != NULL) {\r
-    CopyMem (\r
-      &PxebcMode->PxeDiscover,\r
-      NewPxeDiscover,\r
-      sizeof *NewPxeDiscover\r
-      );\r
-  }\r
-\r
-  if (NewPxeReply != NULL) {\r
-    CopyParse (Private, &PxebcMode->PxeReply, NewPxeReply, PXE_ACK_INDEX);\r
-  }\r
-\r
-  if (NewPxeBisReply != NULL) {\r
-    CopyParse (Private, &PxebcMode->PxeBisReply, NewPxeBisReply, PXE_BIS_INDEX);\r
-  }\r
-  //\r
-  // Unlock the instance data\r
-  //\r
-  EfiReleaseLock (&Private->Lock);\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/* eof - pxe_bc_dhcp.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_igmp.c b/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_igmp.c
deleted file mode 100644 (file)
index 30d9417..0000000
+++ /dev/null
@@ -1,416 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-\r
-**/\r
-\r
-\r
-#define RAND_MAX  0x10000\r
-\r
-#include "Bc.h"\r
-\r
-//\r
-// Definitions for internet group management protocol version 2 message\r
-// structure Per RFC 2236, November 1997\r
-//\r
-UINT8      RouterAlertOption[4]  = { 0x80 | 20, 4, 0, 0 };\r
-IPV4_ADDR  AllRoutersGroup       = { { 224, 0, 0, 2 } };\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-ClearGroupTimer (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  UINTN               TimerId\r
-  )\r
-{\r
-  if (Private == NULL) {\r
-    return ;\r
-  }\r
-\r
-  if (TimerId >= Private->MCastGroupCount) {\r
-    return ;\r
-  }\r
-\r
-  if (Private->IgmpGroupEvent[TimerId] == NULL) {\r
-    return ;\r
-  }\r
-\r
-  gBS->CloseEvent (Private->IgmpGroupEvent[TimerId]);\r
-  Private->IgmpGroupEvent[TimerId] = NULL;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-VOID\r
-SetGroupTimer (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  UINTN               TimerId,\r
-  UINTN               MaxRespTime\r
-  )\r
-{\r
-  EFI_STATUS  EfiStatus;\r
-\r
-  if (Private == NULL) {\r
-    return ;\r
-  }\r
-\r
-  if (TimerId >= Private->MCastGroupCount) {\r
-    return ;\r
-  }\r
-\r
-  if (Private->IgmpGroupEvent[TimerId] != NULL) {\r
-    gBS->CloseEvent (Private->IgmpGroupEvent[TimerId]);\r
-  }\r
-\r
-  EfiStatus = gBS->CreateEvent (\r
-                    EVT_TIMER,\r
-                    TPL_CALLBACK,\r
-                    NULL,\r
-                    NULL,\r
-                    &Private->IgmpGroupEvent[TimerId]\r
-                    );\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    Private->IgmpGroupEvent[TimerId] = NULL;\r
-    return ;\r
-  }\r
-\r
-  EfiStatus = gBS->SetTimer (\r
-                    Private->IgmpGroupEvent[TimerId],\r
-                    TimerRelative,\r
-                    MaxRespTime * 1000000 + Random (Private) % RAND_MAX\r
-                    );\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    gBS->CloseEvent (Private->IgmpGroupEvent[TimerId]);\r
-    Private->IgmpGroupEvent[TimerId] = NULL;\r
-  }\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-VOID\r
-SendIgmpMessage (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  UINT8               Type,\r
-  INTN                GroupId\r
-  )\r
-{\r
-  Private->IgmpMessage.Type         = Type;\r
-  Private->IgmpMessage.MaxRespTime  = 0;\r
-  Private->IgmpMessage.Checksum     = 0;\r
-  Private->IgmpMessage.GroupAddress = Private->MCastGroup[GroupId];\r
-  Private->IgmpMessage.Checksum = IpChecksum (\r
-                                    (UINT16 *) &Private->IgmpMessage,\r
-                                    sizeof Private->IgmpMessage\r
-                                    );\r
-\r
-  Ipv4SendWOp (\r
-    Private,\r
-    0,\r
-    (UINT8 *) &Private->IgmpMessage,\r
-    sizeof Private->IgmpMessage,\r
-    PROT_IGMP,\r
-    RouterAlertOption,\r
-    sizeof RouterAlertOption,\r
-    ((Type == IGMP_TYPE_LEAVE_GROUP) ? AllRoutersGroup.L : Private->IgmpMessage.GroupAddress),\r
-    EFI_PXE_BASE_CODE_FUNCTION_IGMP\r
-    );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-VOID\r
-ReportIgmp (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  INTN                GroupId\r
-  )\r
-{\r
-  //\r
-  // if version 1 querier, send v1 report\r
-  //\r
-  UINT8 Type;\r
-\r
-  if (Private->Igmpv1TimeoutEvent != NULL) {\r
-    if (!EFI_ERROR (gBS->CheckEvent (Private->Igmpv1TimeoutEvent))) {\r
-      gBS->CloseEvent (Private->Igmpv1TimeoutEvent);\r
-      Private->Igmpv1TimeoutEvent = NULL;\r
-      Private->UseIgmpv1Reporting = TRUE;\r
-    }\r
-  }\r
-\r
-  Type = (UINT8) (Private->UseIgmpv1Reporting ? IGMP_TYPE_V1REPORT : IGMP_TYPE_REPORT);\r
-\r
-  SendIgmpMessage (Private, Type, GroupId);\r
-  ClearGroupTimer (Private, GroupId);\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-VOID\r
-IgmpCheckTimers (\r
-  PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  UINTN GroupId;\r
-\r
-  if (Private == NULL) {\r
-    return ;\r
-  }\r
-\r
-  for (GroupId = 0; GroupId < Private->MCastGroupCount; ++GroupId) {\r
-    if (Private->IgmpGroupEvent[GroupId] == NULL) {\r
-      continue;\r
-    }\r
-\r
-    if (!EFI_ERROR (gBS->CheckEvent (Private->IgmpGroupEvent[GroupId]))) {\r
-      //\r
-      // send a report\r
-      //\r
-      ReportIgmp (Private, GroupId);\r
-    }\r
-  }\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return 0 := Group not found\r
-  @return other := Group ID#\r
-\r
-**/\r
-INTN\r
-FindMulticastGroup (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  UINT32              GroupAddress\r
-  )\r
-{\r
-  UINTN GroupId;\r
-\r
-  for (GroupId = 0; GroupId < Private->MCastGroupCount; ++GroupId) {\r
-    if (Private->MCastGroup[GroupId] == GroupAddress) {\r
-      return GroupId + 1;\r
-    }\r
-  }\r
-\r
-  return 0;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-VOID\r
-IgmpJoinGroup (\r
-  PXE_BASECODE_DEVICE  *Private,\r
-  EFI_IP_ADDRESS       *GroupPtr\r
-  )\r
-{\r
-  UINT32  Grp;\r
-\r
-  Grp = *(UINT32 *) GroupPtr;\r
-\r
-  //\r
-  // see if we already have it or if we can't take anymore\r
-  //\r
-  if (FindMulticastGroup (Private, Grp) || Private->MCastGroupCount == MAX_MCAST_GROUPS) {\r
-    return ;\r
-  }\r
-  //\r
-  // add the group\r
-  //\r
-  Private->MCastGroup[Private->MCastGroupCount] = Grp;\r
-\r
-  ReportIgmp (Private, Private->MCastGroupCount);\r
-  //\r
-  // send a report\r
-  // so it will get sent again per RFC 2236\r
-  //\r
-  SetGroupTimer (\r
-    Private,\r
-    Private->MCastGroupCount++,\r
-    UNSOLICITED_REPORT_INTERVAL * 10\r
-    );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-VOID\r
-IgmpLeaveGroup (\r
-  PXE_BASECODE_DEVICE       *Private,\r
-  EFI_IP_ADDRESS            *GroupPtr\r
-  )\r
-{\r
-  UINT32  Grp;\r
-  UINTN   GroupId;\r
-\r
-  Grp = *(UINT32 *) GroupPtr;\r
-\r
-  //\r
-  // if not in group, ignore\r
-  //\r
-  GroupId = FindMulticastGroup (Private, Grp);\r
-\r
-  if (GroupId == 0) {\r
-    return ;\r
-  }\r
-  //\r
-  // if not v1 querrier, send leave group IGMP message\r
-  //\r
-  if (Private->Igmpv1TimeoutEvent != NULL) {\r
-    if (!EFI_ERROR (gBS->CheckEvent (Private->Igmpv1TimeoutEvent))) {\r
-      gBS->CloseEvent (Private->Igmpv1TimeoutEvent);\r
-      Private->Igmpv1TimeoutEvent = NULL;\r
-      Private->UseIgmpv1Reporting = TRUE;\r
-    } else {\r
-      SendIgmpMessage (Private, IGMP_TYPE_LEAVE_GROUP, GroupId - 1);\r
-    }\r
-  }\r
-\r
-  while (GroupId < Private->MCastGroupCount) {\r
-    Private->MCastGroup[GroupId - 1]      = Private->MCastGroup[GroupId];\r
-    Private->IgmpGroupEvent[GroupId - 1]  = Private->IgmpGroupEvent[GroupId];\r
-    ++GroupId;\r
-  }\r
-\r
-  --Private->MCastGroupCount;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-VOID\r
-HandleIgmp (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  IGMPV2_MESSAGE      *IgmpMessagePtr,\r
-  UINTN               IgmpLength\r
-  )\r
-{\r
-  EFI_STATUS  EfiStatus;\r
-  UINTN       GroupId;\r
-  INTN        MaxRespTime;\r
-\r
-  if (Private == NULL) {\r
-    return ;\r
-  }\r
-\r
-  if (Private->MCastGroupCount == 0) {\r
-    //\r
-    // if we don't belong to any multicast groups, ignore\r
-    //\r
-    return ;\r
-  }\r
-  //\r
-  // verify checksum\r
-  //\r
-  if (IpChecksum ((UINT16 *) IgmpMessagePtr, IgmpLength)) {\r
-    //\r
-    // bad checksum - ignore packet\r
-    //\r
-    return ;\r
-  }\r
-\r
-  switch (IgmpMessagePtr->Type) {\r
-  case IGMP_TYPE_QUERY:\r
-    //\r
-    // if a version 1 querier, note the fact and set max resp time\r
-    //\r
-    MaxRespTime = IgmpMessagePtr->MaxRespTime;\r
-\r
-    if (MaxRespTime == 0) {\r
-      Private->UseIgmpv1Reporting = TRUE;\r
-\r
-      if (Private->Igmpv1TimeoutEvent != NULL) {\r
-        gBS->CloseEvent (Private->Igmpv1TimeoutEvent);\r
-      }\r
-\r
-      EfiStatus = gBS->CreateEvent (\r
-                        EVT_TIMER,\r
-                        TPL_CALLBACK,\r
-                        NULL,\r
-                        NULL,\r
-                        &Private->Igmpv1TimeoutEvent\r
-                        );\r
-\r
-      if (EFI_ERROR (EfiStatus)) {\r
-        Private->Igmpv1TimeoutEvent = NULL;\r
-      } else {\r
-        EfiStatus = gBS->SetTimer (\r
-                          Private->Igmpv1TimeoutEvent,\r
-                          TimerRelative,\r
-                          (UINT64) V1ROUTER_PRESENT_TIMEOUT * 10000000\r
-                          );\r
-      }\r
-\r
-      MaxRespTime = IGMP_DEFAULT_MAX_RESPONSE_TIME * 10;\r
-    }\r
-    //\r
-    // if a general query (!GroupAddress), set all our group timers\r
-    //\r
-    if (!IgmpMessagePtr->GroupAddress) {\r
-      for (GroupId = 0; GroupId < Private->MCastGroupCount; ++GroupId) {\r
-        SetGroupTimer (Private, GroupId, MaxRespTime);\r
-      }\r
-    } else {\r
-      //\r
-      // specific query - set only specific group\r
-      //\r
-      GroupId = FindMulticastGroup (Private, IgmpMessagePtr->GroupAddress);\r
-\r
-      if (GroupId != 0) {\r
-        SetGroupTimer (Private, GroupId - 1, MaxRespTime);\r
-      }\r
-    }\r
-\r
-    break;\r
-\r
-  //\r
-  // if we have a timer running for this group, clear it\r
-  //\r
-  case IGMP_TYPE_V1REPORT:\r
-  case IGMP_TYPE_REPORT:\r
-    GroupId = FindMulticastGroup (Private, IgmpMessagePtr->GroupAddress);\r
-\r
-    if (GroupId != 0) {\r
-      ClearGroupTimer (Private, GroupId - 1);\r
-    }\r
-\r
-    break;\r
-  }\r
-}\r
-\r
-/* EOF - pxe_bc_igmp.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_ip.c b/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_ip.c
deleted file mode 100644 (file)
index e05440d..0000000
+++ /dev/null
@@ -1,844 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  pxe_bc_ip.c\r
-\r
-Abstract:\r
-\r
-\r
-**/\r
-\r
-#include "Bc.h"\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-  Check if two IP addresses are on the same subnet.\r
-\r
-  @param  IpLength     Length of IP address in bytes.\r
-  @param  Ip1          IP address to check.\r
-  @param  Ip2          IP address to check.\r
-  @param  SubnetMask   Subnet mask to check with.\r
-\r
-  @retval TRUE         IP addresses are on the same subnet.\r
-  @retval FALSE        IP addresses are on different subnets.\r
-\r
-**/\r
-BOOLEAN\r
-OnSameSubnet (\r
-  IN UINTN           IpLength,\r
-  IN EFI_IP_ADDRESS  *Ip1,\r
-  IN EFI_IP_ADDRESS  *Ip2,\r
-  IN EFI_IP_ADDRESS  *SubnetMask\r
-  )\r
-{\r
-  if (IpLength == 0 || Ip1 == NULL || Ip2 == NULL || SubnetMask == NULL) {\r
-    return FALSE;\r
-  }\r
-\r
-  while (IpLength-- != 0) {\r
-    if ((Ip1->v6.Addr[IpLength] ^ Ip2->v6.Addr[IpLength]) & SubnetMask->v6.Addr[IpLength]) {\r
-      return FALSE;\r
-    }\r
-  }\r
-\r
-  return TRUE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-  Add router to router table.\r
-\r
-  @param  Private      Pointer PxeBc instance data.\r
-  @param  RouterIpPtr  Pointer to router IP address.\r
-\r
-  @return Nothing\r
-\r
-**/\r
-VOID\r
-IpAddRouter (\r
-  IN PXE_BASECODE_DEVICE *Private,\r
-  IN EFI_IP_ADDRESS      *RouterIpPtr\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxeBcMode;\r
-  UINTN                   Index;\r
-\r
-  if (Private == NULL || RouterIpPtr == NULL) {\r
-    return ;\r
-  }\r
-\r
-  PxeBcMode = Private->EfiBc.Mode;\r
-\r
-  //\r
-  // if we are filled up or this is not on the same subnet, forget it\r
-  //\r
-  if ((PxeBcMode->RouteTableEntries == PXE_ROUTER_TABLE_SIZE) ||\r
-    !OnSameSubnet(Private->IpLength, &PxeBcMode->StationIp, RouterIpPtr, &PxeBcMode->SubnetMask)) {\r
-    return ;\r
-  }\r
-  //\r
-  // make sure we don't already have it\r
-  //\r
-  for (Index = 0; Index < PxeBcMode->RouteTableEntries; ++Index) {\r
-    if (!CompareMem (\r
-          &PxeBcMode->RouteTable[Index].GwAddr,\r
-          RouterIpPtr,\r
-          Private->IpLength\r
-          )) {\r
-      return ;\r
-    }\r
-  }\r
-  //\r
-  // keep it\r
-  //\r
-  ZeroMem (\r
-    &PxeBcMode->RouteTable[PxeBcMode->RouteTableEntries],\r
-    sizeof (EFI_PXE_BASE_CODE_ROUTE_ENTRY)\r
-    );\r
-\r
-  CopyMem (\r
-    &PxeBcMode->RouteTable[PxeBcMode->RouteTableEntries++].GwAddr,\r
-    RouterIpPtr,\r
-    Private->IpLength\r
-    );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// return router ip to use for DestIp (0 if none)\r
-//\r
-EFI_IP_ADDRESS *\r
-GetRouterIp (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  EFI_IP_ADDRESS      *DestIpPtr\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxeBcMode;\r
-  UINTN                   Index;\r
-\r
-  if (Private == NULL || DestIpPtr == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  PxeBcMode = Private->EfiBc.Mode;\r
-\r
-  for (Index = 0; Index < PxeBcMode->RouteTableEntries; ++Index) {\r
-    if (OnSameSubnet (\r
-          Private->IpLength,\r
-          &PxeBcMode->RouteTable[Index].IpAddr,\r
-          DestIpPtr,\r
-          &PxeBcMode->RouteTable[Index].SubnetMask\r
-          )) {\r
-      return &PxeBcMode->RouteTable[Index].GwAddr;\r
-    }\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// routine to send ipv4 packet\r
-// ipv4 header of length HdrLth in TransmitBufferPtr\r
-// routine fills in ipv4hdr Ver_Hdl, TotalLength, and Checksum, moves in Data\r
-// and gets dest MAC address\r
-//\r
-#define IP_TX_BUFFER  ((IPV4_BUFFER *) Private->TransmitBufferPtr)\r
-#define IP_TX_HEADER  IP_TX_BUFFER->IpHeader\r
-\r
-EFI_STATUS\r
-Ipv4Xmt (\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  UINT32                      GatewayIp,\r
-  UINTN                       IpHeaderLength,\r
-  UINTN                       TotalHeaderLength,\r
-  VOID                        *Data,\r
-  UINTN                       DataLength,\r
-  EFI_PXE_BASE_CODE_FUNCTION  Function\r
-  )\r
-{\r
-  EFI_MAC_ADDRESS             DestMac;\r
-  EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
-  EFI_PXE_BASE_CODE_MODE      *PxeBcMode;\r
-  EFI_STATUS                  StatCode;\r
-  UINTN                       PacketLength;\r
-\r
-  Snp           = Private->SimpleNetwork;\r
-  PxeBcMode     = Private->EfiBc.Mode;\r
-  StatCode      = EFI_SUCCESS;\r
-  PacketLength  = TotalHeaderLength + DataLength;\r
-\r
-  //\r
-  // get dest MAC address\r
-  // multicast - convert to hw equiv\r
-  // unicast on same net, use arp\r
-  // on different net, arp for router\r
-  //\r
-  if (IP_TX_HEADER.DestAddr.L == BROADCAST_IPv4) {\r
-    CopyMem (&DestMac, &Snp->Mode->BroadcastAddress, sizeof (DestMac));\r
-  } else if (IS_MULTICAST (&IP_TX_HEADER.DestAddr)) {\r
-    StatCode = (*Snp->MCastIpToMac) (Snp, PxeBcMode->UsingIpv6, (EFI_IP_ADDRESS *) &IP_TX_HEADER.DestAddr, &DestMac);\r
-  } else {\r
-    UINT32  Ip;\r
-\r
-    if (OnSameSubnet (\r
-          Private->IpLength,\r
-          &PxeBcMode->StationIp,\r
-          (EFI_IP_ADDRESS *) &IP_TX_HEADER.DestAddr,\r
-          &PxeBcMode->SubnetMask\r
-          )) {\r
-      Ip = IP_TX_HEADER.DestAddr.L;\r
-    } else if (GatewayIp != 0) {\r
-      Ip = GatewayIp;\r
-    } else {\r
-      EFI_IP_ADDRESS  *TmpIp;\r
-\r
-      TmpIp = GetRouterIp (Private, (EFI_IP_ADDRESS *) &IP_TX_HEADER.DestAddr);\r
-\r
-      if (TmpIp == NULL) {\r
-        DEBUG (\r
-          (DEBUG_WARN,\r
-          "\nIpv4Xmit()  Exit #1  %xh (%r)",\r
-          EFI_NO_RESPONSE,\r
-          EFI_NO_RESPONSE)\r
-          );\r
-\r
-        return EFI_NO_RESPONSE;\r
-        //\r
-        // no router\r
-        //\r
-      }\r
-\r
-      Ip = TmpIp->Addr[0];\r
-    }\r
-\r
-    if (!GetHwAddr (\r
-          Private,\r
-          (EFI_IP_ADDRESS *) &Ip,\r
-          (EFI_MAC_ADDRESS *) &DestMac\r
-          )) {\r
-      if (!PxeBcMode->AutoArp) {\r
-        DEBUG (\r
-          (DEBUG_WARN,\r
-          "\nIpv4Xmit()  Exit #2  %xh (%r)",\r
-          EFI_DEVICE_ERROR,\r
-          EFI_DEVICE_ERROR)\r
-          );\r
-\r
-        return EFI_DEVICE_ERROR;\r
-      } else {\r
-        StatCode = DoArp (\r
-                    Private,\r
-                    (EFI_IP_ADDRESS *) &Ip,\r
-                    (EFI_MAC_ADDRESS *) &DestMac\r
-                    );\r
-      }\r
-    }\r
-  }\r
-\r
-  if (EFI_ERROR (StatCode)) {\r
-    DEBUG ((DEBUG_WARN, "\nIpv4Xmit()  Exit #3  %xh (%r)", StatCode, StatCode));\r
-    return StatCode;\r
-  }\r
-  //\r
-  // fill in packet info\r
-  //\r
-  SET_IPV4_VER_HDL (&IP_TX_HEADER, IpHeaderLength);\r
-  IP_TX_HEADER.TotalLength    = HTONS (PacketLength);\r
-  IP_TX_HEADER.HeaderChecksum = IpChecksum ((UINT16 *) &IP_TX_HEADER, IpHeaderLength);\r
-  CopyMem (((UINT8 *) &IP_TX_HEADER) + TotalHeaderLength, Data, DataLength);\r
-\r
-  //\r
-  // send it\r
-  //\r
-  return SendPacket (\r
-          Private,\r
-          (UINT8 *) &IP_TX_HEADER - Snp->Mode->MediaHeaderSize,\r
-          &IP_TX_HEADER,\r
-          PacketLength,\r
-          &DestMac,\r
-          PXE_PROTOCOL_ETHERNET_IP,\r
-          Function\r
-          );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// send ipv4 packet with option\r
-//\r
-EFI_STATUS\r
-Ipv4SendWOp (\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  UINT32                      GatewayIp,\r
-  UINT8                       *Msg,\r
-  UINTN                       MessageLength,\r
-  UINT8                       Prot,\r
-  UINT8                       *Option,\r
-  UINTN                       OptionLength,\r
-  UINT32                      DestIp,\r
-  EFI_PXE_BASE_CODE_FUNCTION  Function\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxeBcMode;\r
-  UINTN                   HdrLth;\r
-\r
-  PxeBcMode = Private->EfiBc.Mode;\r
-  HdrLth    = sizeof (IPV4_HEADER) + OptionLength;\r
-\r
-  ZeroMem ((VOID *) &IP_TX_HEADER, sizeof (IPV4_HEADER));\r
-  IP_TX_HEADER.TimeToLive     = PxeBcMode->TTL;\r
-  IP_TX_HEADER.TypeOfService  = PxeBcMode->ToS;\r
-  IP_TX_HEADER.Protocol       = Prot;\r
-  IP_TX_HEADER.SrcAddr.L      = *(UINT32 *) &PxeBcMode->StationIp;\r
-  IP_TX_HEADER.DestAddr.L     = DestIp;\r
-  IP_TX_HEADER.Id             = Random (Private);\r
-  CopyMem (IP_TX_BUFFER->u.Data, Option, OptionLength);\r
-  return Ipv4Xmt (\r
-          Private,\r
-          GatewayIp,\r
-          HdrLth,\r
-          HdrLth,\r
-          Msg,\r
-          MessageLength,\r
-          Function\r
-          );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// send MessageLength message at MessagePtr - higher level protocol header already in TransmitBufferPtr, length HdrSize\r
-//\r
-EFI_STATUS\r
-Ip4Send (\r
-  PXE_BASECODE_DEVICE                          *Private,  // pointer to instance data\r
-  UINTN               MayFrag,                            //\r
-  UINT8                                    Prot,          // protocol\r
-  UINT32                          SrcIp,                  // Source IP address\r
-  UINT32                 DestIp,                          // Destination IP address\r
-  UINT32              GatewayIp,                          // used if not NULL and needed\r
-  UINTN               HdrSize,                            // protocol header byte length\r
-  UINT8               *MessagePtr,                        // pointer to data\r
-  UINTN               MessageLength                       // data byte length\r
-  )\r
-{\r
-  EFI_STATUS  StatCode;\r
-  UINTN       TotDataLength;\r
-\r
-  TotDataLength = HdrSize + MessageLength;\r
-\r
-  if (TotDataLength > MAX_IPV4_DATA_SIZE) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nIp4Send()  Exit #1  %xh (%r)",\r
-      EFI_BAD_BUFFER_SIZE,\r
-      EFI_BAD_BUFFER_SIZE)\r
-      );\r
-\r
-    return EFI_BAD_BUFFER_SIZE;\r
-  }\r
-\r
-  ZeroMem ((VOID *) &IP_TX_HEADER, sizeof (IPV4_HEADER));\r
-  IP_TX_HEADER.TimeToLive = DEFAULT_TTL;\r
-  IP_TX_HEADER.Protocol   = Prot;\r
-  IP_TX_HEADER.SrcAddr.L  = SrcIp;\r
-  IP_TX_HEADER.DestAddr.L = DestIp;\r
-  IP_TX_HEADER.Id         = Random (Private);\r
-\r
-  if (!MayFrag) {\r
-    *(UINT8 *) (&IP_TX_HEADER.FragmentFields) = IP_NO_FRAG >> 8;\r
-  }\r
-  //\r
-  // check for need to fragment\r
-  //\r
-  if (TotDataLength > MAX_IPV4_FRAME_DATA_SIZE) {\r
-    UINTN   DataLengthSent;\r
-    UINT16  FragmentOffset;\r
-\r
-    FragmentOffset = IP_MORE_FRAG;\r
-    //\r
-    // frag offset field\r
-    //\r
-    if (!MayFrag) {\r
-      DEBUG (\r
-        (DEBUG_WARN,\r
-        "\nIp4Send()  Exit #2  %xh (%r)",\r
-        EFI_BAD_BUFFER_SIZE,\r
-        EFI_BAD_BUFFER_SIZE)\r
-        );\r
-\r
-      return EFI_BAD_BUFFER_SIZE;\r
-    }\r
-    //\r
-    // send out in fragments - first includes upper level header\r
-    // all are max and include more frag bit except last\r
-    //\r
-    * (UINT8 *) (&IP_TX_HEADER.FragmentFields) = IP_MORE_FRAG >> 8;\r
-\r
-#define IPV4_FRAG_SIZE    (MAX_IPV4_FRAME_DATA_SIZE & 0xfff8)\r
-#define IPV4_FRAG_OFF_INC (IPV4_FRAG_SIZE >> 3)\r
-\r
-    DataLengthSent = IPV4_FRAG_SIZE - HdrSize;\r
-\r
-    StatCode = Ipv4Xmt (\r
-                Private,\r
-                GatewayIp,\r
-                sizeof (IPV4_HEADER),\r
-                sizeof (IPV4_HEADER) + HdrSize,\r
-                MessagePtr,\r
-                DataLengthSent,\r
-                Private->Function\r
-                );\r
-\r
-    if (EFI_ERROR (StatCode)) {\r
-      DEBUG (\r
-        (DEBUG_WARN,\r
-        "\nIp4Send()  Exit #3  %xh (%r)",\r
-        StatCode,\r
-        StatCode)\r
-        );\r
-\r
-      return StatCode;\r
-    }\r
-\r
-    MessagePtr += DataLengthSent;\r
-    MessageLength -= DataLengthSent;\r
-    FragmentOffset += IPV4_FRAG_OFF_INC;\r
-    IP_TX_HEADER.FragmentFields = HTONS (FragmentOffset);\r
-\r
-    while (MessageLength > IPV4_FRAG_SIZE) {\r
-      StatCode = Ipv4Xmt (\r
-                  Private,\r
-                  GatewayIp,\r
-                  sizeof (IPV4_HEADER),\r
-                  sizeof (IPV4_HEADER),\r
-                  MessagePtr,\r
-                  IPV4_FRAG_SIZE,\r
-                  Private->Function\r
-                  );\r
-\r
-      if (EFI_ERROR (StatCode)) {\r
-        DEBUG (\r
-          (DEBUG_WARN,\r
-          "\nIp4Send()  Exit #3  %xh (%r)",\r
-          StatCode,\r
-          StatCode)\r
-          );\r
-\r
-        return StatCode;\r
-      }\r
-\r
-      MessagePtr += IPV4_FRAG_SIZE;\r
-      MessageLength -= IPV4_FRAG_SIZE;\r
-      FragmentOffset += IPV4_FRAG_OFF_INC;\r
-      IP_TX_HEADER.FragmentFields = HTONS (FragmentOffset);\r
-    }\r
-\r
-    * (UINT8 *) (&IP_TX_HEADER.FragmentFields) &= ~(IP_MORE_FRAG >> 8);\r
-    HdrSize = 0;\r
-  }\r
-  //\r
-  // transmit\r
-  //\r
-  return Ipv4Xmt (\r
-          Private,\r
-          GatewayIp,\r
-          sizeof (IPV4_HEADER),\r
-          sizeof (IPV4_HEADER) + HdrSize,\r
-          MessagePtr,\r
-          MessageLength,\r
-          Private->Function\r
-          );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// return true if dst IP in receive header matched with what's enabled\r
-//\r
-BOOLEAN\r
-IPgood (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  IPV4_HEADER         *IpHeader\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxeBcMode;\r
-  UINTN                   Index;\r
-\r
-  PxeBcMode = Private->EfiBc.Mode;\r
-\r
-  if (PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) {\r
-    return TRUE;\r
-  }\r
-\r
-  if ((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) &&\r
-      IS_MULTICAST (&IpHeader->DestAddr)\r
-        ) {\r
-    return TRUE;\r
-  }\r
-\r
-  if ((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) &&\r
-      PxeBcMode->StationIp.Addr[0] == IpHeader->DestAddr.L\r
-      ) {\r
-    return TRUE;\r
-  }\r
-\r
-  if ((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) && IpHeader->DestAddr.L == BROADCAST_IPv4) {\r
-    return TRUE;\r
-  }\r
-\r
-  for (Index = 0; Index < PxeBcMode->IpFilter.IpCnt; ++Index) {\r
-    if (IpHeader->DestAddr.L == PxeBcMode->IpFilter.IpList[Index].Addr[0]) {\r
-      return TRUE;\r
-    }\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// receive up to MessageLength message into MessagePtr for protocol Prot\r
-// return message length, src/dest ips if select any, and pointer to protocol\r
-// header routine will filter based on source and/or dest ip if OpFlags set.\r
-//\r
-EFI_STATUS\r
-IpReceive (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  PXE_OPFLAGS         OpFlags,\r
-  EFI_IP_ADDRESS      *SrcIpPtr,\r
-  EFI_IP_ADDRESS      *DestIpPtr,\r
-  UINT8               Prot,\r
-  VOID                *HeaderPtr,\r
-  UINTN               HdrSize,\r
-  UINT8               *MessagePtr,\r
-  UINTN               *MessageLengthPtr,\r
-  EFI_EVENT           TimeoutEvent\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxeBcMode;\r
-  EFI_STATUS              StatCode;\r
-  UINTN                   ByteCount;\r
-  UINTN                   FragmentCount;\r
-  UINTN                   ExpectedPacketLength;\r
-  UINTN                   Id;\r
-  BOOLEAN                 GotFirstFragment;\r
-  BOOLEAN                 GotLastFragment;\r
-\r
-  DEBUG (\r
-    (DEBUG_NET,\r
-    "\nIpReceive()  Hdr=%Xh  HdrSz=%d  Data=%Xh  DataSz=%d",\r
-    HeaderPtr,\r
-    HdrSize,\r
-    MessagePtr,\r
-    *MessageLengthPtr)\r
-    );\r
-\r
-  PxeBcMode                     = Private->EfiBc.Mode;\r
-  PxeBcMode->IcmpErrorReceived  = FALSE;\r
-\r
-  ExpectedPacketLength          = 0;\r
-  GotFirstFragment              = FALSE;\r
-  GotLastFragment               = FALSE;\r
-  FragmentCount                 = 0;\r
-  ByteCount                     = 0;\r
-  Id = 0;\r
-\r
-  for (;;) {\r
-    IPV4_HEADER IpHdr;\r
-    UINTN       FFlds;\r
-    UINTN       TotalLength;\r
-    UINTN       FragmentOffset;\r
-    UINTN       HeaderSize;\r
-    UINTN       BufferSize;\r
-    UINTN       IpHeaderLength;\r
-    UINTN       DataLength;\r
-    UINT16      Protocol;\r
-    UINT8       *NextHdrPtr;\r
-    UINT8       *PacketPtr;\r
-\r
-    StatCode = WaitForReceive (\r
-                Private,\r
-                Private->Function,\r
-                TimeoutEvent,\r
-                &HeaderSize,\r
-                &BufferSize,\r
-                &Protocol\r
-                );\r
-\r
-    if (EFI_ERROR (StatCode)) {\r
-      return StatCode;\r
-    }\r
-\r
-    PacketPtr = Private->ReceiveBufferPtr + HeaderSize;\r
-\r
-    if (Protocol == PXE_PROTOCOL_ETHERNET_ARP) {\r
-      HandleArpReceive (\r
-        Private,\r
-        (ARP_PACKET *) PacketPtr,\r
-        Private->ReceiveBufferPtr\r
-        );\r
-\r
-      continue;\r
-    }\r
-\r
-    if (Protocol != PXE_PROTOCOL_ETHERNET_IP) {\r
-      continue;\r
-    }\r
-\r
-#define IpRxHeader  ((IPV4_HEADER *) PacketPtr)\r
-\r
-    //\r
-    // filter for version & check sum\r
-    //\r
-    IpHeaderLength = IPV4_HEADER_LENGTH (IpRxHeader);\r
-\r
-    if ((IpRxHeader->VersionIhl >> 4) != IPVER4) {\r
-      continue;\r
-    }\r
-\r
-    if (IpChecksum ((UINT16 *) IpRxHeader, IpHeaderLength)) {\r
-      continue;\r
-    }\r
-\r
-    CopyMem (&IpHdr, IpRxHeader, sizeof (IpHdr));\r
-    TotalLength = NTOHS (IpHdr.TotalLength);\r
-\r
-    if (IpHdr.Protocol == PROT_TCP) {\r
-      //\r
-      // The NextHdrPtr is used to seed the header buffer we are passing back.\r
-      // That being the case, we want to see everything in pPkt which contains\r
-      // everything but the ethernet (or whatever) frame.  IP + TCP in this case.\r
-      //\r
-      DataLength  = TotalLength;\r
-      NextHdrPtr  = PacketPtr;\r
-    } else {\r
-      DataLength  = TotalLength - IpHeaderLength;\r
-      NextHdrPtr  = PacketPtr + IpHeaderLength;\r
-    }\r
-    //\r
-    // If this is an ICMP, it might not be for us.\r
-    // Double check the state of the IP stack and the\r
-    // packet fields before assuming it is an ICMP\r
-    // error.  ICMP requests are not supported by the\r
-    // PxeBc IP stack and should be ignored.\r
-    //\r
-    if (IpHdr.Protocol == PROT_ICMP) {\r
-      ICMPV4_HEADER *Icmpv4;\r
-\r
-      Icmpv4 = (ICMPV4_HEADER *) NextHdrPtr;\r
-\r
-      //\r
-      // For now only obvious ICMP error replies will be accepted by\r
-      // this stack.  This still makes us vulnerable to DoS attacks.\r
-      // But at least we will not be killed by DHCP daemons.\r
-      //\r
-      switch (Icmpv4->Type) {\r
-      case ICMP_REDIRECT:\r
-      case ICMP_ECHO:\r
-      case ICMP_ROUTER_ADV:\r
-      case ICMP_ROUTER_SOLICIT:\r
-      case ICMP_TIMESTAMP:\r
-      case ICMP_TIMESTAMP_REPLY:\r
-      case ICMP_INFO_REQ:\r
-      case ICMP_INFO_REQ_REPLY:\r
-      case ICMP_SUBNET_MASK_REQ:\r
-      case ICMP_SUBNET_MASK_REPLY:\r
-      default:\r
-        continue;\r
-\r
-      //\r
-      // %%TBD - This should be implemented.\r
-      //\r
-      case ICMP_ECHO_REPLY:\r
-        continue;\r
-\r
-      case ICMP_DEST_UNREACHABLE:\r
-      case ICMP_TIME_EXCEEDED:\r
-      case ICMP_PARAMETER_PROBLEM:\r
-      case ICMP_SOURCE_QUENCH:\r
-        PxeBcMode->IcmpErrorReceived = TRUE;\r
-\r
-        CopyMem (\r
-          &PxeBcMode->IcmpError,\r
-          NextHdrPtr,\r
-          sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)\r
-          );\r
-\r
-        DEBUG (\r
-          (DEBUG_NET,\r
-          "\nIpReceive()  Exit #1  %Xh (%r)",\r
-          EFI_ICMP_ERROR,\r
-          EFI_ICMP_ERROR)\r
-          );\r
-      }\r
-\r
-      return EFI_ICMP_ERROR;\r
-    }\r
-\r
-    if (IpHdr.Protocol == PROT_IGMP) {\r
-      HandleIgmp (Private, (IGMPV2_MESSAGE *) NextHdrPtr, DataLength);\r
-\r
-      DEBUG ((DEBUG_NET, "\n  IGMP"));\r
-      continue;\r
-    }\r
-    //\r
-    // check for protocol\r
-    //\r
-    if (IpHdr.Protocol != Prot) {\r
-      continue;\r
-    }\r
-    //\r
-    // do filtering\r
-    //\r
-    if (!(OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP) && SrcIpPtr && SrcIpPtr->Addr[0] != IpHdr.SrcAddr.L) {\r
-      DEBUG ((DEBUG_NET, "\n  Not expected source IP address."));\r
-      continue;\r
-    }\r
-\r
-    if (OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) {\r
-      if (!IPgood (Private, &IpHdr)) {\r
-        continue;\r
-      }\r
-    } else if (!(OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP)) {\r
-      if (DestIpPtr == NULL) {\r
-        if (PxeBcMode->StationIp.Addr[0] != IpHdr.DestAddr.L) {\r
-          continue;\r
-        }\r
-      } else if (DestIpPtr->Addr[0] != IpHdr.DestAddr.L) {\r
-        continue;\r
-      }\r
-    }\r
-    //\r
-    // get some data we need\r
-    //\r
-    FFlds           = NTOHS (IpHdr.FragmentFields);\r
-    FragmentOffset  = ((FFlds & IP_FRAG_OFF_MSK) << 3);\r
-\r
-    /* Keep count of fragments that belong to this session.\r
-     * If we get packets with a different IP ID number,\r
-     * ignore them.  Ignored packets should be handled\r
-     * by the upper level protocol.\r
-     */\r
-    if (FragmentCount == 0) {\r
-      Id = IpHdr.Id;\r
-\r
-      if (DestIpPtr != NULL) {\r
-        DestIpPtr->Addr[0] = IpHdr.DestAddr.L;\r
-      }\r
-\r
-      if (SrcIpPtr != NULL) {\r
-        SrcIpPtr->Addr[0] = IpHdr.SrcAddr.L;\r
-      }\r
-    } else {\r
-      if (IpHdr.Id != Id) {\r
-        continue;\r
-      }\r
-    }\r
-\r
-    ++FragmentCount;\r
-\r
-    /* Fragment management.\r
-     */\r
-    if (FragmentOffset == 0) {\r
-      /* This is the first fragment (may also be the\r
-       * only fragment).\r
-       */\r
-      GotFirstFragment = TRUE;\r
-\r
-      /* If there is a separate protocol header buffer,\r
-       * copy the header, adjust the data pointer and\r
-       * the data length.\r
-       */\r
-      if (HdrSize != 0) {\r
-        CopyMem (HeaderPtr, NextHdrPtr, HdrSize);\r
-\r
-        NextHdrPtr += HdrSize;\r
-        DataLength -= HdrSize;\r
-      }\r
-    } else {\r
-      /* If there is a separate protocol header buffer,\r
-       * adjust the fragment offset.\r
-       */\r
-      FragmentOffset -= HdrSize;\r
-    }\r
-\r
-    /* See if this is the last fragment.\r
-     */\r
-    if (!(FFlds & IP_MORE_FRAG)) {\r
-      //\r
-      // This is the last fragment (may also be the only fragment).\r
-      //\r
-      GotLastFragment = TRUE;\r
-\r
-      /* Compute the expected length of the assembled\r
-       * packet.  This will be used to decide if we\r
-       * have gotten all of the fragments.\r
-       */\r
-      ExpectedPacketLength = FragmentOffset + DataLength;\r
-    }\r
-\r
-    DEBUG (\r
-      (DEBUG_NET,\r
-      "\n  ID = %Xh  Off = %d  Len = %d",\r
-      Id,\r
-      FragmentOffset,\r
-      DataLength)\r
-      );\r
-\r
-    /* Check for receive buffer overflow.\r
-     */\r
-    if (FragmentOffset + DataLength > *MessageLengthPtr) {\r
-      /* There is not enough space in the receive\r
-       * buffer for the fragment.\r
-       */\r
-      DEBUG (\r
-        (DEBUG_NET,\r
-        "\nIpReceive()  Exit #3  %Xh (%r)",\r
-        EFI_BUFFER_TOO_SMALL,\r
-        EFI_BUFFER_TOO_SMALL)\r
-        );\r
-\r
-      return EFI_BUFFER_TOO_SMALL;\r
-    }\r
-\r
-    /* Copy data into receive buffer.\r
-     */\r
-    if (DataLength != 0) {\r
-      DEBUG ((DEBUG_NET, "  To = %Xh", MessagePtr + FragmentOffset));\r
-\r
-      CopyMem (MessagePtr + FragmentOffset, NextHdrPtr, DataLength);\r
-      ByteCount += DataLength;\r
-    }\r
-\r
-    /* If we have seen the first and last fragments and\r
-     * the receive byte count is at least as large as the\r
-     * expected byte count, return SUCCESS.\r
-     *\r
-     * We could be tricked by receiving a fragment twice\r
-     * but the upper level protocol should figure this\r
-     * out.\r
-     */\r
-    if (GotFirstFragment && GotLastFragment && ByteCount >= ExpectedPacketLength) {\r
-      *MessageLengthPtr = ExpectedPacketLength;\r
-      return EFI_SUCCESS;\r
-    }\r
-  }\r
-}\r
-\r
-/* eof - pxe_bc_ip.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_mtftp.c b/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_mtftp.c
deleted file mode 100644 (file)
index 702d5fe..0000000
+++ /dev/null
@@ -1,2178 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-\r
-    pxe_bc_mtftp.c\r
-\r
-Abstract:\r
-  TFTP and MTFTP (multicast TFTP) implementation.\r
-\r
-Revision History\r
-\r
-\r
-**/\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// The following #define is used to create a version that does not wait to\r
-// open after a listen.  This is just for a special regression test of MTFTP\r
-// server to make sure multiple opens are handled correctly.  Normally this\r
-// next line should be a comment.\r
-// #define SpecialNowaitVersion    // comment out for normal operation\r
-//\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-#include "Bc.h"\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-UINT64\r
-Swap64 (\r
-  UINT64 n\r
-  )\r
-{\r
-  union {\r
-    UINT64  n;\r
-    UINT8   b[8];\r
-  } u;\r
-\r
-  UINT8 t;\r
-\r
-  u.n     = n;\r
-\r
-  t       = u.b[0];\r
-  u.b[0]  = u.b[7];\r
-  u.b[7]  = t;\r
-\r
-  t       = u.b[1];\r
-  u.b[1]  = u.b[6];\r
-  u.b[6]  = t;\r
-\r
-  t       = u.b[2];\r
-  u.b[2]  = u.b[5];\r
-  u.b[5]  = t;\r
-\r
-  t       = u.b[3];\r
-  u.b[3]  = u.b[4];\r
-  u.b[4]  = t;\r
-\r
-  return u.n;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return EFI_SUCCESS :=\r
-  @return EFI_TFTP_ERROR :=\r
-  @return other :=\r
-\r
-**/\r
-EFI_STATUS\r
-TftpUdpRead (\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  UINT16                      Operation,\r
-  VOID                        *HeaderPtr,\r
-  UINTN                       *BufferSizePtr,\r
-  VOID                        *BufferPtr,\r
-  EFI_IP_ADDRESS              *ServerIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *ServerPortPtr,\r
-  EFI_IP_ADDRESS              *OurIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *OurPortPtr,\r
-  UINT16                      Timeout\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxeBcMode;\r
-  EFI_STATUS              Status;\r
-  EFI_EVENT               TimeoutEvent;\r
-  UINTN                   HeaderSize;\r
-\r
-  //\r
-  //\r
-  //\r
-  Status = gBS->CreateEvent (\r
-                  EVT_TIMER,\r
-                  TPL_CALLBACK,\r
-                  NULL,\r
-                  NULL,\r
-                  &TimeoutEvent\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  Status = gBS->SetTimer (\r
-                  TimeoutEvent,\r
-                  TimerRelative,\r
-                  Timeout * 10000000 + 1000000\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return Status;\r
-  }\r
-  //\r
-  //\r
-  //\r
-  HeaderSize = Private->BigBlkNumFlag ? sizeof (struct Tftpv4Ack8) : sizeof (struct Tftpv4Ack);\r
-\r
-#define ERROR_MESSAGE_PTR ((struct Tftpv4Error *) HeaderPtr)\r
-\r
-  Status = UdpRead (\r
-            Private,\r
-            Operation,\r
-            OurIpPtr,\r
-            OurPortPtr,\r
-            ServerIpPtr,\r
-            ServerPortPtr,\r
-            &HeaderSize,\r
-            HeaderPtr,\r
-            BufferSizePtr,\r
-            BufferPtr,\r
-            TimeoutEvent\r
-            );\r
-\r
-  if (Status != EFI_SUCCESS || ERROR_MESSAGE_PTR->OpCode != HTONS (TFTP_ERROR)) {\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return Status;\r
-  }\r
-  //\r
-  // got an error packet\r
-  // write one byte error code followed by error message\r
-  //\r
-  PxeBcMode                       = Private->EfiBc.Mode;\r
-  PxeBcMode->TftpErrorReceived    = TRUE;\r
-  PxeBcMode->TftpError.ErrorCode  = (UINT8) NTOHS (ERROR_MESSAGE_PTR->ErrCode);\r
-  HeaderSize                      = MIN (*BufferSizePtr, sizeof PxeBcMode->TftpError.ErrorString);\r
-  CopyMem (PxeBcMode->TftpError.ErrorString, BufferPtr, HeaderSize);\r
-\r
-  gBS->CloseEvent (TimeoutEvent);\r
-  return EFI_TFTP_ERROR;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-VOID\r
-SendError (\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  EFI_IP_ADDRESS              *ServerIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *ServerPortPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *OurPortPtr\r
-  )\r
-{\r
-  struct Tftpv4Error  *ErrStr;\r
-  UINTN               Len;\r
-\r
-  ErrStr            = (VOID *) Private->TftpErrorBuffer;\r
-  Len               = sizeof *ErrStr;\r
-\r
-  ErrStr->OpCode    = HTONS (TFTP_ERROR);\r
-  ErrStr->ErrCode   = HTONS (TFTP_ERR_OPTION);\r
-  ErrStr->ErrMsg[0] = 0;\r
-\r
-  UdpWrite (\r
-    Private,\r
-    EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT,\r
-    ServerIpPtr,\r
-    ServerPortPtr,\r
-    0,\r
-    0,\r
-    OurPortPtr,\r
-    0,\r
-    0,\r
-    &Len,\r
-    ErrStr\r
-    );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-SendAckAndGetData (\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  EFI_IP_ADDRESS              *ServerIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *ServerPortPtr,\r
-  EFI_IP_ADDRESS              *ReplyIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *OurPortPtr,\r
-  UINT16                      Timeout,\r
-  UINTN                       *ReplyLenPtr,\r
-  UINT8                       *PxeBcMode,\r
-  UINT64                      *BlockNumPtr,\r
-  BOOLEAN                     AckOnly\r
-  )\r
-{\r
-  struct Tftpv4Data DataBuffer;\r
-  struct Tftpv4Ack  *Ack2Ptr;\r
-  struct Tftpv4Ack8 *Ack8Ptr;\r
-  EFI_STATUS        Status;\r
-  UINTN             Len;\r
-\r
-  Ack2Ptr = (VOID *) Private->TftpAckBuffer;\r
-  Ack8Ptr = (VOID *) Private->TftpAckBuffer;\r
-\r
-  if (Private->BigBlkNumFlag) {\r
-    Len               = sizeof (struct Tftpv4Ack8);\r
-\r
-    Ack8Ptr->OpCode   = HTONS (TFTP_ACK8);\r
-    Ack8Ptr->BlockNum = Swap64 (*BlockNumPtr);\r
-\r
-    Status = UdpWrite (\r
-              Private,\r
-              EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT,\r
-              ServerIpPtr,\r
-              ServerPortPtr,\r
-              0,\r
-              0,\r
-              OurPortPtr,\r
-              0,\r
-              0,\r
-              &Len,\r
-              Ack8Ptr\r
-              );\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  } else {\r
-    Len               = sizeof (struct Tftpv4Ack);\r
-\r
-    Ack2Ptr->OpCode   = HTONS (TFTP_ACK);\r
-    Ack2Ptr->BlockNum = HTONS ((UINT16) *BlockNumPtr);\r
-\r
-    Status = UdpWrite (\r
-              Private,\r
-              EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT,\r
-              ServerIpPtr,\r
-              ServerPortPtr,\r
-              0,\r
-              0,\r
-              OurPortPtr,\r
-              0,\r
-              0,\r
-              &Len,\r
-              Ack2Ptr\r
-              );\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-\r
-  if (AckOnly) {\r
-    //\r
-    // ACK of last packet.  This is just a courtesy.\r
-    // Do not wait for response.\r
-    //\r
-    return EFI_SUCCESS;\r
-  }\r
-  //\r
-  // read reply\r
-  //\r
-  Status = TftpUdpRead (\r
-            Private,\r
-            0,\r
-            &DataBuffer,\r
-            ReplyLenPtr,\r
-            PxeBcMode,\r
-            ServerIpPtr,\r
-            ServerPortPtr,\r
-            ReplyIpPtr,\r
-            OurPortPtr,\r
-            Timeout\r
-            );\r
-\r
-  if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {\r
-    return Status;\r
-  }\r
-  //\r
-  // got a good reply (so far)\r
-  // check for next data packet\r
-  //\r
-  if (!Private->BigBlkNumFlag && DataBuffer.Header.OpCode == HTONS (TFTP_DATA)) {\r
-    if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      SendError (Private, ServerIpPtr, ServerPortPtr, OurPortPtr);\r
-    }\r
-\r
-    *BlockNumPtr = NTOHS (DataBuffer.Header.BlockNum);\r
-    return Status;\r
-  }\r
-\r
-  if (Private->BigBlkNumFlag && DataBuffer.Header.OpCode == HTONS (TFTP_DATA8)) {\r
-    if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      SendError (Private, ServerIpPtr, ServerPortPtr, OurPortPtr);\r
-    }\r
-\r
-    *BlockNumPtr = Swap64 (*(UINT64 *) &DataBuffer.Header.BlockNum);\r
-    return Status;\r
-  }\r
-\r
-  return EFI_PROTOCOL_ERROR;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-LockStepReceive (\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  UINTN                       PacketSize,\r
-  UINT64                      *BufferSizePtr,\r
-  UINT64                      Offset,\r
-  UINT8                       *BufferPtr,\r
-  EFI_IP_ADDRESS              *ServerIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *ServerPortPtr,\r
-  EFI_IP_ADDRESS              *ReplyIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *OurPortPtr,\r
-  UINT64                      LastBlock,\r
-  UINT16                      Timeout,\r
-  IN BOOLEAN                  DontUseBuffer\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINT64      BlockNum;\r
-  UINT64      BufferSize;\r
-  UINTN       Retries;\r
-  UINTN       SaveLen;\r
-  UINTN       ReplyLen;\r
-\r
-  ReplyLen  = PacketSize;\r
-  BlockNum  = LastBlock;\r
-\r
-  DEBUG ((DEBUG_INFO, "\nLockStepReceive()  PacketSize = %d", PacketSize));\r
-\r
-  if (DontUseBuffer) {\r
-    BufferSize = PacketSize;\r
-  } else {\r
-    BufferSize = *BufferSizePtr - Offset;\r
-    BufferPtr += Offset;\r
-  }\r
-\r
-  while (ReplyLen >= 512 && ReplyLen == PacketSize) {\r
-    if (BufferSize < PacketSize) {\r
-      ReplyLen = (UINTN) ((BufferSize > 0) ? BufferSize : 0);\r
-    }\r
-\r
-    SaveLen = ReplyLen;\r
-\r
-    //\r
-    // write an ack packet and get data - retry up to NUM_ACK_RETRIES on timeout\r
-    //\r
-    Retries = NUM_ACK_RETRIES;\r
-\r
-    do {\r
-      ReplyLen = SaveLen;\r
-\r
-      Status = SendAckAndGetData (\r
-                Private,\r
-                ServerIpPtr,\r
-                ServerPortPtr,\r
-                ReplyIpPtr,\r
-                OurPortPtr,\r
-                Timeout,\r
-                (UINTN *) &ReplyLen,\r
-                BufferPtr,\r
-                &BlockNum,\r
-                FALSE\r
-                );\r
-\r
-      if (!EFI_ERROR (Status) || Status == EFI_BUFFER_TOO_SMALL) {\r
-        if (BlockNum == LastBlock) {\r
-          DEBUG ((DEBUG_NET, "\nresend"));\r
-          //\r
-          // a resend - continue\r
-          //\r
-          Status = EFI_TIMEOUT;\r
-        } else if (Private->BigBlkNumFlag) {\r
-          if (BlockNum != ++LastBlock) {\r
-            DEBUG ((DEBUG_NET, "\nLockStepReceive()  Exit #1a"));\r
-            //\r
-            // not correct blocknum - error\r
-            //\r
-            return EFI_PROTOCOL_ERROR;\r
-          }\r
-        } else {\r
-          LastBlock = (LastBlock + 1) & 0xFFFF;\r
-          if (BlockNum != LastBlock) {\r
-            DEBUG ((DEBUG_NET, "\nLockStepReceive()  Exit #1b"));\r
-            return EFI_PROTOCOL_ERROR;\r
-            //\r
-            // not correct blocknum - error\r
-            //\r
-          }\r
-        }\r
-      }\r
-    } while (Status == EFI_TIMEOUT && --Retries);\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      if (Status != EFI_BUFFER_TOO_SMALL) {\r
-        SendError (Private, ServerIpPtr, ServerPortPtr, OurPortPtr);\r
-      }\r
-\r
-      return Status;\r
-    }\r
-\r
-    if (DontUseBuffer) {\r
-      BufferSize += ReplyLen;\r
-    } else {\r
-      BufferPtr += ReplyLen;\r
-      BufferSize -= ReplyLen;\r
-    }\r
-  }\r
-  //\r
-  // while (ReplyLen == PacketSize);\r
-  //\r
-  if (DontUseBuffer) {\r
-    if (BufferSizePtr != NULL) {\r
-      *BufferSizePtr = (BufferSize - PacketSize);\r
-    }\r
-  } else {\r
-    *BufferSizePtr -= BufferSize;\r
-  }\r
-\r
-  /* Send ACK of last packet. */\r
-  ReplyLen = 0;\r
-\r
-  SendAckAndGetData (\r
-    Private,\r
-    ServerIpPtr,\r
-    ServerPortPtr,\r
-    ReplyIpPtr,\r
-    OurPortPtr,\r
-    Timeout,\r
-    (UINTN *) &ReplyLen,\r
-    BufferPtr,\r
-    &BlockNum,\r
-    TRUE\r
-    );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// some literals\r
-//\r
-UINT8                      Mode[]          = MODE_BINARY;\r
-UINT8                      BlockSizeOp[]   = OP_BLKSIZE;\r
-UINT8                      TsizeOp[]       = OP_TFRSIZE;\r
-UINT8                      OverwriteOp[]   = OP_OVERWRITE;\r
-UINT8                      BigBlkNumOp[]   = OP_BIGBLKNUM;\r
-EFI_PXE_BASE_CODE_UDP_PORT TftpRequestPort = TFTP_OPEN_PORT;\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return Pointer to value field if option found or NULL if not found.\r
-\r
-**/\r
-UINT8 *\r
-FindOption (\r
-  UINT8 *OptionPtr,\r
-  INTN  OpLen,\r
-  UINT8 *OackPtr,\r
-  INTN  OackSize\r
-  )\r
-{\r
-  if ((OackSize -= OpLen) <= 0) {\r
-    return NULL;\r
-  }\r
-\r
-  do {\r
-    if (!CompareMem (OackPtr, OptionPtr, OpLen)) {\r
-      return OackPtr + OpLen;\r
-    }\r
-\r
-    ++OackPtr;\r
-  } while (--OackSize);\r
-\r
-  return NULL;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-#define BKSZOP      1 // block size\r
-#define TSIZEOP     2 // transfer size\r
-#define OVERWRITEOP 4 // overwrite\r
-#define BIGBLKNUMOP 8 // big block numbers\r
-EFI_STATUS\r
-TftpRwReq (\r
-  UINT16                      Req,\r
-  UINT16                      Options,\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  EFI_IP_ADDRESS              *ServerIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *ServerPortPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *OurPortPtr,\r
-  UINT8                       *FilenamePtr,\r
-  UINTN                       *PacketSizePtr,\r
-  VOID                        *Buffer\r
-  )\r
-{\r
-  union {\r
-    UINT8             Data[514];\r
-    struct Tftpv4Req  ReqStr;\r
-  } *u;\r
-\r
-  UINT16  OpFlags;\r
-  INTN    Len;\r
-  INTN    TotalLen;\r
-  UINT8   *Ptr;\r
-\r
-  if (*OurPortPtr == 0) {\r
-    OpFlags = EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT | EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT;\r
-  } else {\r
-    OpFlags = EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT;\r
-  }\r
-  //\r
-  // build the basic request - opcode, filename, mode\r
-  //\r
-  u                 = Buffer;\r
-  u->ReqStr.OpCode  = HTONS (Req);\r
-  TotalLen = sizeof (Mode) + sizeof (u->ReqStr.OpCode) + (Len = 1 + AsciiStrLen ((CHAR8 *) FilenamePtr));\r
-\r
-  CopyMem (u->ReqStr.FileName, FilenamePtr, Len);\r
-  Ptr = (UINT8 *) (u->ReqStr.FileName + Len);\r
-\r
-  CopyMem (Ptr, Mode, sizeof (Mode));\r
-  Ptr += sizeof (Mode);\r
-\r
-  if (Options & BKSZOP) {\r
-    CopyMem (Ptr, BlockSizeOp, sizeof (BlockSizeOp));\r
-    UtoA10 (*PacketSizePtr, Ptr + sizeof (BlockSizeOp));\r
-\r
-    TotalLen += (Len = 1 + AsciiStrLen ((CHAR8 *) (Ptr + sizeof (BlockSizeOp))) + sizeof (BlockSizeOp));\r
-\r
-    Ptr += Len;\r
-  }\r
-\r
-  if (Options & TSIZEOP) {\r
-    CopyMem (Ptr, TsizeOp, sizeof (TsizeOp));\r
-    CopyMem (Ptr + sizeof (TsizeOp), "0", 2);\r
-    TotalLen += sizeof (TsizeOp) + 2;\r
-    Ptr += sizeof (TsizeOp) + 2;\r
-  }\r
-\r
-  if (Options & OVERWRITEOP) {\r
-    CopyMem (Ptr, OverwriteOp, sizeof (OverwriteOp));\r
-    CopyMem (Ptr + sizeof (OverwriteOp), "1", 2);\r
-    TotalLen += sizeof (OverwriteOp) + 2;\r
-    Ptr += sizeof (OverwriteOp) + 2;\r
-  }\r
-\r
-  if (Options & BIGBLKNUMOP) {\r
-    CopyMem (Ptr, BigBlkNumOp, sizeof (BigBlkNumOp));\r
-    CopyMem (Ptr + sizeof (BigBlkNumOp), "8", 2);\r
-    TotalLen += sizeof (BigBlkNumOp) + 2;\r
-    Ptr += sizeof (BigBlkNumOp) + 2;\r
-  }\r
-  //\r
-  // send it\r
-  //\r
-  return UdpWrite (\r
-          Private,\r
-          OpFlags,\r
-          ServerIpPtr,\r
-          ServerPortPtr,\r
-          0,\r
-          0,\r
-          OurPortPtr,\r
-          0,\r
-          0,\r
-          (UINTN *) &TotalLen,\r
-          u\r
-          );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-TftpRwReqwResp (\r
-  UINT16                      Req,\r
-  UINT16                      Options,\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  VOID                        *HeaderPtr,\r
-  UINTN                       *PacketSizePtr,\r
-  UINTN                       *ReplyLenPtr,\r
-  VOID                        *BufferPtr,\r
-  EFI_IP_ADDRESS              *ServerIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *ServerPortPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *ServerReplyPortPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  *OurPortPtr,\r
-  UINT8                       *FilenamePtr,\r
-  UINT16                      Timeout\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINTN       SaveReplyLen;\r
-  INTN        Retries;\r
-  UINT8       Buffer[514];\r
-\r
-  SaveReplyLen            = *ReplyLenPtr;\r
-  Retries                 = 3;\r
-  Private->BigBlkNumFlag  = FALSE;\r
-  *OurPortPtr             = 0;\r
-  //\r
-  // generate random\r
-  //\r
-  do {\r
-    if (*OurPortPtr != 0) {\r
-      if (++ *OurPortPtr == 0) {\r
-        *OurPortPtr = PXE_RND_PORT_LOW;\r
-      }\r
-    }\r
-    //\r
-    // send request from our Ip = StationIp\r
-    //\r
-    if ((Status = TftpRwReq (\r
-                    Req,\r
-                    Options,\r
-                    Private,\r
-                    ServerIpPtr,\r
-                    ServerPortPtr,\r
-                    OurPortPtr,\r
-                    FilenamePtr,\r
-                    PacketSizePtr,\r
-                    Buffer\r
-                    )) != EFI_SUCCESS) {\r
-      DEBUG (\r
-        (DEBUG_WARN,\r
-        "\nTftpRwReqwResp()  Exit #1  %xh (%r)",\r
-        Status,\r
-        Status)\r
-        );\r
-\r
-      return Status;\r
-    }\r
-    //\r
-    // read reply to our Ip = StationIp\r
-    //\r
-    *ReplyLenPtr = SaveReplyLen;\r
-\r
-    Status = TftpUdpRead (\r
-              Private,\r
-              EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT,\r
-              HeaderPtr,\r
-              ReplyLenPtr,\r
-              BufferPtr,\r
-              ServerIpPtr,\r
-              ServerReplyPortPtr,\r
-              0,\r
-              OurPortPtr,\r
-              Timeout\r
-              );\r
-  } while (Status == EFI_TIMEOUT && --Retries);\r
-\r
-  if (!Options || Status != EFI_TFTP_ERROR) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nTftpRwReqwResp()  Exit #2  %xh (%r)",\r
-      Status,\r
-      Status)\r
-      );\r
-    return Status;\r
-  }\r
-\r
-  Status = TftpRwReqwResp (\r
-            Req,\r
-            0,\r
-            Private,\r
-            HeaderPtr,\r
-            PacketSizePtr,\r
-            ReplyLenPtr,\r
-            BufferPtr,\r
-            ServerIpPtr,\r
-            ServerPortPtr,\r
-            ServerReplyPortPtr,\r
-            OurPortPtr,\r
-            FilenamePtr,\r
-            Timeout\r
-            );\r
-\r
-  DEBUG ((DEBUG_WARN, "\nTftpRwReqwResp()  Exit #3  %xh (%r)", Status, Status));\r
-\r
-  return Status;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// mtftp listen\r
-// read on mcast ip, cport, from sport, for data packet\r
-// returns success if gets multicast last packet or all up to last block\r
-// if not missing, then finished\r
-//\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-MtftpListen (\r
-  PXE_BASECODE_DEVICE           *Private,\r
-  UINT64                        *BufferSizePtr,\r
-  UINT8                         *BufferPtr,\r
-  EFI_IP_ADDRESS                *ServerIpPtr,\r
-  EFI_PXE_BASE_CODE_MTFTP_INFO  *MtftpInfoPtr,\r
-  UINT64                        *StartBlockPtr,\r
-  UINTN                         *NumMissedPtr,\r
-  UINT16                        TransTimeout,\r
-  UINT16                        ListenTimeout,\r
-  UINT64                        FinalBlock,\r
-  IN BOOLEAN                    DontUseBuffer\r
-  )\r
-{\r
-  EFI_STATUS        Status;\r
-  struct Tftpv4Ack  Header;\r
-  UINT64            Offset;\r
-  UINT64            BlockNum;\r
-  UINT64            LastBlockNum;\r
-  UINT64            BufferSize;\r
-  UINTN             NumMissed;\r
-  UINTN             PacketSize;\r
-  UINTN             SaveReplyLen;\r
-  UINTN             ReplyLen;\r
-  UINT16            Timeout;\r
-\r
-  LastBlockNum  = *StartBlockPtr;\r
-  Timeout       = ListenTimeout;\r
-  *NumMissedPtr = 0;\r
-  PacketSize    = 0;\r
-  BufferSize    = *BufferSizePtr;\r
-  ReplyLen      = MAX_TFTP_PKT_SIZE;;\r
-\r
-  //\r
-  // receive\r
-  //\r
-  do {\r
-    if ((SaveReplyLen = ReplyLen) > BufferSize) {\r
-      SaveReplyLen = 0;\r
-    }\r
-\r
-    /* %%TBD - add big block number support */\r
-\r
-    //\r
-    // get data - loop on resends\r
-    //\r
-    do {\r
-      ReplyLen = SaveReplyLen;\r
-\r
-      if ((Status = TftpUdpRead (\r
-                      Private,\r
-                      0,\r
-                      &Header,\r
-                      &ReplyLen,\r
-                      BufferPtr,\r
-                      ServerIpPtr,\r
-                      &MtftpInfoPtr->SPort,\r
-                      &MtftpInfoPtr->MCastIp,\r
-                      &MtftpInfoPtr->CPort,\r
-                      Timeout\r
-                      )) != EFI_SUCCESS) {\r
-        return Status;\r
-      }\r
-      //\r
-      // make sure a data packet\r
-      //\r
-      if (Header.OpCode != HTONS (TFTP_DATA)) {\r
-        return EFI_PROTOCOL_ERROR;\r
-      }\r
-    } while ((BlockNum = NTOHS (Header.BlockNum)) == LastBlockNum);\r
-\r
-    //\r
-    // make sure still going up\r
-    //\r
-    if (LastBlockNum > BlockNum) {\r
-      return EFI_PROTOCOL_ERROR;\r
-    }\r
-\r
-    if (BlockNum - LastBlockNum > 0xFFFFFFFF) {\r
-      return EFI_PROTOCOL_ERROR;\r
-    } else {\r
-      NumMissed = (UINTN) (BlockNum - LastBlockNum - 1);\r
-    }\r
-\r
-    LastBlockNum = BlockNum;\r
-\r
-    //\r
-    // if first time through, some reinitialization\r
-    //\r
-    if (!PacketSize) {\r
-      *StartBlockPtr  = BlockNum;\r
-      PacketSize      = ReplyLen;\r
-      Timeout         = TransTimeout;\r
-    } else {\r
-      *NumMissedPtr = (UINT16) (*NumMissedPtr + NumMissed);\r
-    }\r
-    //\r
-    // if missed packets, update start block,\r
-    // etc. and move packet to proper place in buffer\r
-    //\r
-    if (NumMissed) {\r
-      *StartBlockPtr = BlockNum;\r
-      if (!DontUseBuffer) {\r
-        Offset = NumMissed * PacketSize;\r
-        CopyMem (BufferPtr + Offset, BufferPtr, ReplyLen);\r
-        BufferPtr += Offset;\r
-        BufferSize -= Offset;\r
-      }\r
-    }\r
-\r
-    if (!DontUseBuffer) {\r
-      BufferPtr += ReplyLen;\r
-      BufferSize -= ReplyLen;\r
-    }\r
-  } while (ReplyLen == PacketSize && BlockNum != FinalBlock);\r
-\r
-  *BufferSizePtr = BufferSize;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return // mtftp open session\r
-  @return // return code EFI_SUCCESS\r
-  @return //      and *CompletionStatusPtr = GOTUNI | GOTMULTI means done\r
-  @return //      and *CompletionStatusPtr = GOTMULTI means got first two multicast packets, use listen for rest\r
-  @return //      and *CompletionStatusPtr = 0 means did not get first two multicast packets, use listen for all\r
-  @retval GOTUNI  returns NO_DATA go will go to TFTP session)\r
-\r
-**/\r
-EFI_STATUS\r
-MtftpOpen (\r
-  PXE_BASECODE_DEVICE                                               * Private,\r
-  UINT64                                                            *BufferSizePtr,\r
-  UINT8                                                             *BufferPtr,\r
-  UINTN                                                             *PacketSizePtr,\r
-  EFI_IP_ADDRESS                                                    * ServerIpPtr,\r
-  UINT8                                                             *FilenamePtr,\r
-  EFI_PXE_BASE_CODE_MTFTP_INFO                                      * MtftpInfoPtr,\r
-  UINT8                                                             *CompletionStatusPtr,\r
-#define GOTUNI 1\r
-#define GOTMULTI 2\r
-  IN BOOLEAN                    DontUseBuffer\r
-  )\r
-{\r
-  EFI_STATUS        Status;\r
-  EFI_IP_ADDRESS    OurReplyIp;\r
-  struct Tftpv4Ack  Header;\r
-  INTN              ReplyLen;\r
-  INTN              Retries;\r
-  UINT8             *BufferPtr2;\r
-  UINT8             TmpBuf[514];\r
-\r
-  Retries         = NUM_MTFTP_OPEN_RETRIES;\r
-  BufferPtr2      = BufferPtr;\r
-  *PacketSizePtr  = (UINTN) (MIN (*BufferSizePtr, MAX_TFTP_PKT_SIZE));\r
-\r
-  do {\r
-    //\r
-    // send a read request\r
-    //\r
-    *CompletionStatusPtr = 0;\r
-\r
-    if ((Status = TftpRwReq (\r
-                    TFTP_RRQ,\r
-                    0,\r
-                    Private,\r
-                    ServerIpPtr,\r
-                    &MtftpInfoPtr->SPort,\r
-                    &MtftpInfoPtr->CPort,\r
-                    FilenamePtr,\r
-                    PacketSizePtr,\r
-                    TmpBuf\r
-                    )) != EFI_SUCCESS) {\r
-      return Status;\r
-    }\r
-\r
-    for (;;) {\r
-      //\r
-      // read reply\r
-      //\r
-      ZeroMem (&OurReplyIp, Private->IpLength);\r
-      ReplyLen = *PacketSizePtr;\r
-\r
-      if ((Status = TftpUdpRead (\r
-                      Private,\r
-                      EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER,\r
-                      &Header,\r
-                      (UINTN *) &ReplyLen,\r
-                      BufferPtr2,\r
-                      ServerIpPtr,\r
-                      &MtftpInfoPtr->SPort,\r
-                      &OurReplyIp,\r
-                      &MtftpInfoPtr->CPort,\r
-                      MtftpInfoPtr->TransmitTimeout\r
-                      )) == EFI_SUCCESS) {\r
-        //\r
-        // check for first data packet\r
-        //\r
-        if (Header.OpCode != HTONS (TFTP_DATA)) {\r
-          return EFI_PROTOCOL_ERROR;\r
-        }\r
-        //\r
-        // check block num\r
-        //\r
-        if (Header.BlockNum != HTONS (1)) {\r
-          //\r
-          // it's not first\r
-          // if we are not the primary client,\r
-          // we probably got first and now second\r
-          // multicast but no unicast, so\r
-          // *CompletionStatusPtr = GOTMULTI - if this is\r
-          // the second, can just go on to listen\r
-          // starting with 2 as the last block\r
-          // received\r
-          //\r
-          if (Header.BlockNum != HTONS (2)) {\r
-            //\r
-            // not second\r
-            //\r
-            *CompletionStatusPtr = 0;\r
-          }\r
-\r
-          return Status;\r
-        }\r
-\r
-        //\r
-        // now actual\r
-        //\r
-        *PacketSizePtr = ReplyLen;\r
-        //\r
-        // see if a unicast data packet\r
-        //\r
-        if (!CompareMem (\r
-              &OurReplyIp,\r
-              &Private->EfiBc.Mode->StationIp,\r
-              Private->IpLength\r
-              )) {\r
-          *CompletionStatusPtr |= GOTUNI;\r
-          //\r
-          // it is\r
-          // if already got multicast packet,\r
-          // got em both\r
-          //\r
-          if (*CompletionStatusPtr & GOTMULTI) {\r
-            break;\r
-          }\r
-        } else if (!CompareMem (\r
-                    &OurReplyIp,\r
-                    &MtftpInfoPtr->MCastIp,\r
-                    Private->IpLength\r
-                    )) {\r
-          //\r
-          // otherwise see if a multicast data packet\r
-          //\r
-          *CompletionStatusPtr |= GOTMULTI;\r
-          //\r
-          // it is\r
-          // got first - bump pointer so that if\r
-          // second multi comes along, we're OK\r
-          //\r
-          if (!DontUseBuffer) {\r
-            BufferPtr2 = (UINT8 *) BufferPtr + ReplyLen;\r
-          }\r
-          //\r
-          // if already got unicast packet,\r
-          // got em both\r
-          //\r
-          if (*CompletionStatusPtr & GOTUNI) {\r
-            break;\r
-          }\r
-        } else {\r
-          //\r
-          // else protocol error\r
-          //\r
-          return EFI_PROTOCOL_ERROR;\r
-        }\r
-      } else if (Status == EFI_TIMEOUT) {\r
-        //\r
-        // bad return code - if timed out, retry\r
-        //\r
-        break;\r
-      } else {\r
-        //\r
-        // else just bad - failed MTFTP open\r
-        //\r
-        return Status;\r
-      }\r
-    }\r
-  } while (Status == EFI_TIMEOUT && --Retries);\r
-\r
-  if (Status != EFI_SUCCESS) {\r
-    //\r
-    // open failed\r
-    //\r
-    return Status;\r
-  }\r
-  //\r
-  // got em both - go into receive mode\r
-  // routine to read rest of file after a successful open (TFTP or MTFTP)\r
-  // sends ACK and gets next data packet until short packet arrives,\r
-  // then sends ACK and (hopefully) times out\r
-  //\r
-  return LockStepReceive (\r
-          Private,\r
-          (UINT16) ReplyLen,\r
-          BufferSizePtr,\r
-          ReplyLen,\r
-          BufferPtr,\r
-          ServerIpPtr,\r
-          &MtftpInfoPtr->SPort,\r
-          &MtftpInfoPtr->MCastIp,\r
-          &MtftpInfoPtr->CPort,\r
-          1,\r
-          MtftpInfoPtr->TransmitTimeout,\r
-          DontUseBuffer\r
-          );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-MtftpDownload (\r
-  PXE_BASECODE_DEVICE           *Private,\r
-  UINT64                        *BufferSizePtr,\r
-  UINT8                         *BufferPtr,\r
-  EFI_IP_ADDRESS                *ServerIpPtr,\r
-  UINT8                         *FilenamePtr,\r
-  EFI_PXE_BASE_CODE_MTFTP_INFO  *MtftpInfoPtr,\r
-  IN BOOLEAN                    DontUseBuffer\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_IP_FILTER Filter;\r
-  EFI_STATUS                  Status;\r
-  UINT64                      StartBlock;\r
-  UINT64                      LastBlock;\r
-  UINT64                      LastStartBlock;\r
-  UINT64                      BufferSize;\r
-  UINTN                       Offset;\r
-  UINTN                       NumMissed;\r
-  UINT16                      TransTimeout;\r
-  UINT16                      ListenTimeout;\r
-  UINT8                       *BufferPtrLocal;\r
-\r
-  TransTimeout      = MtftpInfoPtr->TransmitTimeout;\r
-  ListenTimeout     = MtftpInfoPtr->ListenTimeout;\r
-  LastBlock         = 0;\r
-  LastStartBlock    = 0;\r
-  Offset            = 0;\r
-\r
-  Filter.Filters    = EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST;\r
-  Filter.IpCnt      = 2;\r
-  CopyMem (&Filter.IpList[0], &Private->EfiBc.Mode->StationIp, sizeof (EFI_IP_ADDRESS));\r
-  CopyMem (&Filter.IpList[1], &MtftpInfoPtr->MCastIp, sizeof (EFI_IP_ADDRESS));\r
-\r
-  if ((Status = IpFilter (Private, &Filter)) != EFI_SUCCESS) {\r
-    return Status;\r
-  }\r
-\r
-  for (;;) {\r
-    StartBlock  = LastStartBlock;\r
-    BufferSize  = *BufferSizePtr - Offset;\r
-\r
-    if (DontUseBuffer) {\r
-    //\r
-    // overwrie the temp buf\r
-    //\r
-      BufferPtrLocal = BufferPtr;\r
-    } else {\r
-      BufferPtrLocal = BufferPtr + Offset;\r
-\r
-    }\r
-    //\r
-    // special !!! do not leave enabled in saved version on Source Safe\r
-    // Following code put in in order to create a special version for regression\r
-    // test of MTFTP server to make sure it handles mulitple opens correctly.\r
-    // This code should NOT be enabled normally.\r
-    //\r
-    if (((Status = MtftpListen (\r
-                      Private,\r
-                      &BufferSize,\r
-                      BufferPtrLocal,\r
-                      ServerIpPtr,\r
-                      MtftpInfoPtr,\r
-                      &StartBlock,\r
-                      &NumMissed,\r
-                      TransTimeout,\r
-                      ListenTimeout,\r
-                      LastBlock,\r
-                      DontUseBuffer\r
-                      )) != EFI_SUCCESS) && (Status != EFI_TIMEOUT)) {\r
-        return Status;\r
-        //\r
-        // failed\r
-        //\r
-    }\r
-    //\r
-    // if none were received, start block is not reset\r
-    //\r
-    if (StartBlock == LastStartBlock) {\r
-      UINT8 CompStat;\r
-\r
-      //\r
-      // timed out with none received - try MTFTP open\r
-      //\r
-      if ((Status = MtftpOpen (\r
-                      Private,\r
-                      BufferSizePtr,\r
-                      BufferPtr,\r
-                      &Offset,\r
-                      ServerIpPtr,\r
-                      FilenamePtr,\r
-                      MtftpInfoPtr,\r
-                      &CompStat,\r
-                      DontUseBuffer\r
-                      )) != EFI_SUCCESS) {\r
-        //\r
-        // open failure - try TFTP\r
-        //\r
-        return Status;\r
-      }\r
-      //\r
-      // return code EFI_SUCCESS\r
-      // and *CompletionStatusPtr = GOTUNI | GOTMULTI means done\r
-      // and *CompletionStatusPtr = GOTMULTI means got first two multicast packets, use listen for rest\r
-      // and *CompletionStatusPtr = 0 means did not get first two multicast packets, use listen for all\r
-      // (do not get = GOTUNI - returns NO_DATA go will go to TFTP session)\r
-      //\r
-      if (CompStat == (GOTUNI | GOTMULTI)) {\r
-      //\r
-      // finished - got it all\r
-      //\r
-        return Status;\r
-      }\r
-\r
-      if (CompStat) {\r
-        //\r
-        // offset is two packet lengths\r
-        //\r
-        Offset <<= 1;\r
-        //\r
-        // last block received\r
-        //\r
-        LastStartBlock = 2;\r
-      } else {\r
-        Offset          = 0;\r
-        LastStartBlock  = 0;\r
-      }\r
-\r
-      ListenTimeout = TransTimeout;\r
-      continue;\r
-    }\r
-    //\r
-    // did we get the last block\r
-    //\r
-    if (Status == EFI_SUCCESS) {\r
-      //\r
-      // yes - set the file size if this was first time\r
-      //\r
-      if (!LastBlock) {\r
-        *BufferSizePtr -= BufferSize;\r
-      }\r
-      //\r
-      // if buffer was too small, finished\r
-      //\r
-      if (!DontUseBuffer) {\r
-        return EFI_BUFFER_TOO_SMALL;\r
-      }\r
-      //\r
-      // if we got them all, finished\r
-      //\r
-      if (!NumMissed && StartBlock == LastStartBlock + 1) {\r
-        return Status;\r
-      }\r
-      //\r
-      // did not get them all - set last block\r
-      //\r
-      LastBlock = (UINT16) (StartBlock - 1);\r
-    }\r
-    //\r
-    // compute listen timeout\r
-    //\r
-    ListenTimeout = (UINT16) ((NumMissed > MtftpInfoPtr->ListenTimeout) ? 0 : (MtftpInfoPtr->ListenTimeout - NumMissed));\r
-\r
-    //\r
-    // reset\r
-    //\r
-    Offset          = 0;\r
-    LastStartBlock  = 0;\r
-  }\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-TftpInfo (\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  UINT64                      *BufferSizePtr,\r
-  EFI_IP_ADDRESS              *ServerIpPtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  SrvPort,\r
-  UINT8                       *FilenamePtr,\r
-  UINTN                       *PacketSizePtr\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_UDP_PORT  OurPort;\r
-  EFI_PXE_BASE_CODE_UDP_PORT  ServerReplyPort;\r
-  EFI_STATUS                  Status;\r
-  UINT64                      BlockNum;\r
-  UINTN                       Offset;\r
-  UINTN                       ReplyLen;\r
-  UINT8                       *Ptr;\r
-\r
-  union {\r
-    struct Tftpv4Oack OAck2Ptr;\r
-    struct Tftpv4Ack  Ack2Ptr;\r
-    struct Tftpv4Data Datastr;\r
-  } u;\r
-\r
-  OurPort         = 0;\r
-  ServerReplyPort = 0;\r
-  ReplyLen        = sizeof (u.Datastr.Data);\r
-\r
-  //\r
-  // send a write request with the blocksize option -\r
-  // sets our IP and port - and receive reply - sets his port\r
-  // will retry operation up to 3 times if no response,\r
-  // and will retry without options on an error reply\r
-  //\r
-  if ((Status = TftpRwReqwResp (\r
-                  TFTP_RRQ,\r
-                  /* BIGBLKNUMOP | */BKSZOP | TSIZEOP,\r
-                  Private,\r
-                  &u,\r
-                  PacketSizePtr,\r
-                  &ReplyLen,\r
-                  u.Datastr.Data,\r
-                  ServerIpPtr,\r
-                  &SrvPort,\r
-                  &ServerReplyPort,\r
-                  &OurPort,\r
-                  FilenamePtr,\r
-                  REQ_RESP_TIMEOUT\r
-                  )) != EFI_SUCCESS) {\r
-    DEBUG ((DEBUG_WARN, "\nTftpInfo()  Exit #1"));\r
-    return Status;\r
-  }\r
-  //\r
-  // check for good OACK\r
-  //\r
-  if (u.OAck2Ptr.OpCode == HTONS (TFTP_OACK)) {\r
-    //\r
-    // now parse it for options\r
-    // bigblk#\r
-    //\r
-    Ptr = FindOption (\r
-            BigBlkNumOp,\r
-            sizeof (BigBlkNumOp),\r
-            u.OAck2Ptr.OpAck[0].Option,\r
-            ReplyLen + sizeof (u.Ack2Ptr.BlockNum)\r
-            );\r
-\r
-    if (Ptr != NULL) {\r
-      if (AtoU (Ptr) == 8) {\r
-        Private->BigBlkNumFlag = TRUE;\r
-      } else {\r
-        return EFI_PROTOCOL_ERROR;\r
-      }\r
-    }\r
-    //\r
-    // blksize\r
-    //\r
-    Ptr = FindOption (\r
-            BlockSizeOp,\r
-            sizeof (BlockSizeOp),\r
-            u.OAck2Ptr.OpAck[0].Option,\r
-            ReplyLen += sizeof (u.Ack2Ptr.BlockNum)\r
-            );\r
-\r
-    *PacketSizePtr = (Ptr) ? AtoU (Ptr) : 512;\r
-\r
-    //\r
-    // tsize\r
-    //\r
-    Ptr = FindOption (\r
-            TsizeOp,\r
-            sizeof (TsizeOp),\r
-            u.OAck2Ptr.OpAck[0].Option,\r
-            ReplyLen\r
-            );\r
-\r
-    if (Ptr != NULL) {\r
-      *BufferSizePtr = AtoU64 (Ptr);\r
-\r
-      //\r
-      // teminate session with error\r
-      //\r
-      SendError (Private, ServerIpPtr, &ServerReplyPort, &OurPort);\r
-\r
-      return EFI_SUCCESS;\r
-    }\r
-\r
-    Offset    = 0;\r
-    BlockNum  = 0;\r
-  } else {\r
-    //\r
-    // if MTFTP get filesize, return unsupported\r
-    //\r
-    if (SrvPort != TftpRequestPort) {\r
-      SendError (Private, ServerIpPtr, &ServerReplyPort, &OurPort);\r
-      DEBUG ((DEBUG_WARN, "\nTftpInfo()  Exit #3"));\r
-      return EFI_UNSUPPORTED;\r
-    }\r
-\r
-    Offset    = ReplyLen;\r
-    //\r
-    // last block received\r
-    //\r
-    BlockNum  = 1;\r
-  }\r
-  //\r
-  // does not support the option - do a download with no buffer\r
-  //\r
-  *BufferSizePtr = 0;\r
-\r
-  Status = LockStepReceive (\r
-            Private,\r
-            (UINT16) ReplyLen,\r
-            BufferSizePtr,\r
-            Offset,\r
-            (UINT8 *) &u,\r
-            ServerIpPtr,\r
-            &ServerReplyPort,\r
-            &Private->EfiBc.Mode->StationIp,\r
-            &OurPort,\r
-            BlockNum,\r
-            ACK_TIMEOUT,\r
-            TRUE\r
-            );\r
-\r
-  if (Status != EFI_SUCCESS) {\r
-    DEBUG ((DEBUG_WARN, "\nTftpInfo()  LockStepReceive() == %Xh", Status));\r
-  }\r
-\r
-  if (Status != EFI_BUFFER_TOO_SMALL) {\r
-    return Status;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-TftpDownload (\r
-  PXE_BASECODE_DEVICE         *Private,\r
-  UINT64                      *BufferSizePtr,\r
-  UINT8                       *BufferPtr,\r
-  EFI_IP_ADDRESS              *ServerIpPtr,\r
-  UINT8                       *FilenamePtr,\r
-  UINTN                       *PacketSizePtr,\r
-  EFI_PXE_BASE_CODE_UDP_PORT  SrvPort,\r
-  UINT16                      Req,\r
-  IN BOOLEAN                  DontUseBuffer\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_UDP_PORT  OurPort;\r
-  EFI_PXE_BASE_CODE_UDP_PORT  ServerReplyPort;\r
-  EFI_STATUS                  Status;\r
-  UINT64                      Offset;\r
-  UINT64                      BlockNum;\r
-  UINTN                       ReplyLen;\r
-  UINT8                       *Ptr;\r
-\r
-  union {\r
-    struct Tftpv4Ack    Ack2Ptr;\r
-    struct Tftpv4Oack   OAck2Ptr;\r
-    struct Tftpv4Data   Data;\r
-    struct Tftpv4Ack8   Ack8Ptr;\r
-    struct Tftpv4Data8  Data8;\r
-  } U;\r
-\r
-  OurPort         = 0;\r
-  ServerReplyPort = 0;\r
-  ReplyLen        = (UINTN) ((*BufferSizePtr > 0xFFFF) ? 0xFFFF : *BufferSizePtr);\r
-\r
-  //\r
-  // send a read request with the blocksize option - sets our IP and port\r
-  // - and receive reply - sets his port will retry operation up to 3\r
-  // times if no response, and will retry without options on an error\r
-  // reply\r
-  //\r
-  if ((Status = TftpRwReqwResp (\r
-                  Req,\r
-                  /* BIGBLKNUMOP | */BKSZOP,\r
-                  Private,\r
-                  &U,\r
-                  PacketSizePtr,\r
-                  &ReplyLen,\r
-                  BufferPtr,\r
-                  ServerIpPtr,\r
-                  &SrvPort,\r
-                  &ServerReplyPort,\r
-                  &OurPort,\r
-                  FilenamePtr,\r
-                  REQ_RESP_TIMEOUT\r
-                  )) != EFI_SUCCESS) {\r
-    DEBUG ((DEBUG_WARN, "\nTftpDownload()  Exit #1  %xh (%r)", Status, Status));\r
-    return Status;\r
-  }\r
-  //\r
-  // check for OACK\r
-  //\r
-  if (U.OAck2Ptr.OpCode == HTONS (TFTP_OACK)) {\r
-    //\r
-    // get the OACK\r
-    //\r
-    CopyMem (U.Data.Data, BufferPtr, ReplyLen);\r
-\r
-    Ptr = FindOption (\r
-            BigBlkNumOp,\r
-            sizeof (BigBlkNumOp),\r
-            U.OAck2Ptr.OpAck[0].Option,\r
-            ReplyLen + sizeof (U.Ack2Ptr.BlockNum)\r
-            );\r
-\r
-    if (Ptr != NULL) {\r
-      if (AtoU (Ptr) == 8) {\r
-        Private->BigBlkNumFlag = TRUE;\r
-      } else {\r
-        return EFI_PROTOCOL_ERROR;\r
-      }\r
-    }\r
-    //\r
-    // now parse it for blocksize option\r
-    //\r
-    Ptr = FindOption (\r
-            BlockSizeOp,\r
-            sizeof (BlockSizeOp),\r
-            U.OAck2Ptr.OpAck[0].Option,\r
-            ReplyLen += sizeof (U.Ack2Ptr.BlockNum)\r
-            );\r
-\r
-    ReplyLen  = (Ptr != NULL) ? AtoU (Ptr) : 512;\r
-\r
-    Offset    = 0;\r
-    //\r
-    // last block received\r
-    //\r
-    BlockNum  = 0;\r
-  } else if (U.Ack2Ptr.OpCode != HTONS (TFTP_DATA) || U.Ack2Ptr.BlockNum != HTONS (1)) {\r
-    //\r
-    // or data\r
-    //\r
-    DEBUG ((DEBUG_WARN, "\nTftpDownload()  Exit #2  %xh (%r)", Status, Status));\r
-\r
-    return EFI_PROTOCOL_ERROR;\r
-  } else {\r
-    //\r
-    // got good data packet\r
-    //\r
-    Offset    = ReplyLen;\r
-    //\r
-    // last block received\r
-    //\r
-    BlockNum  = 1;\r
-  }\r
-\r
-  if (PacketSizePtr != NULL) {\r
-    *PacketSizePtr = ReplyLen;\r
-  }\r
-  //\r
-  // routine to read rest of file after a successful open (TFTP or MTFTP)\r
-  // sends ACK and gets next data packet until short packet arrives, then sends\r
-  // ACK and (hopefully) times out\r
-  // if first packet has been read, BufferPtr and BufferSize must reflect fact\r
-  //\r
-  Status = LockStepReceive (\r
-            Private,\r
-            ReplyLen,\r
-            BufferSizePtr,\r
-            Offset,\r
-            BufferPtr,\r
-            ServerIpPtr,\r
-            &ServerReplyPort,\r
-            &Private->EfiBc.Mode->StationIp,\r
-            &OurPort,\r
-            BlockNum,\r
-            ACK_TIMEOUT,\r
-            DontUseBuffer\r
-            );\r
-\r
-  if (Status != EFI_SUCCESS) {\r
-    DEBUG ((DEBUG_WARN, "\nTftpDownload()  Exit #3  %xh (%r)", Status, Status));\r
-\r
-    if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      Status = TftpInfo (\r
-                Private,\r
-                BufferSizePtr,\r
-                ServerIpPtr,\r
-                SrvPort,\r
-                FilenamePtr,\r
-                PacketSizePtr\r
-                );\r
-\r
-      if (!EFI_ERROR (Status)) {\r
-        Status = EFI_BUFFER_TOO_SMALL;\r
-      }\r
-    }\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-TftpUpload (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  UINT64              *BufferSizePtr,\r
-  VOID                *BufferPtr,\r
-  EFI_IP_ADDRESS      *ServerIpPtr,\r
-  UINT8               *FilenamePtr,\r
-  UINTN               *PacketSizePtr,\r
-  BOOLEAN             Overwrite\r
-  )\r
-{\r
-  struct Tftpv4Ack            Header;\r
-  EFI_PXE_BASE_CODE_UDP_PORT  OurPort;\r
-  EFI_PXE_BASE_CODE_UDP_PORT  ServerReplyPort;\r
-  EFI_STATUS                  Status;\r
-  UINT64                      BlockNum;\r
-  UINT64                      TransferSize;\r
-  UINTN                       ReplyLen;\r
-  UINTN                       TransferLen;\r
-  UINT16                      Options;\r
-  UINT8                       *Ptr;\r
-\r
-  union {\r
-    struct Tftpv4Oack OAck2Ptr;\r
-    struct Tftpv4Ack  Ack2Ptr;\r
-    struct Tftpv4Data Datastr;\r
-  } u;\r
-\r
-  OurPort         = 0;\r
-  ServerReplyPort = 0;\r
-  TransferSize    = *BufferSizePtr;\r
-  ReplyLen        = sizeof (u.Datastr.Data);\r
-  Options         = (UINT16) ((Overwrite) ? OVERWRITEOP | BKSZOP : BKSZOP);\r
-\r
-  //\r
-  // send a write request with the blocksize option - sets our IP and port -\r
-  // and receive reply - sets his port\r
-  // will retry operation up to 3 times if no response, and will retry without\r
-  // options on an error reply\r
-  //\r
-  if ((Status = TftpRwReqwResp (\r
-                  TFTP_WRQ,\r
-                  Options,\r
-                  Private,\r
-                  &u,\r
-                  PacketSizePtr,\r
-                  &ReplyLen,\r
-                  u.Datastr.Data,\r
-                  ServerIpPtr,\r
-                  &TftpRequestPort,\r
-                  &ServerReplyPort,\r
-                  &OurPort,\r
-                  FilenamePtr,\r
-                  REQ_RESP_TIMEOUT\r
-                  )) != EFI_SUCCESS) {\r
-    return Status;\r
-  }\r
-  //\r
-  // check for OACK\r
-  //\r
-  if (u.OAck2Ptr.OpCode == HTONS (TFTP_OACK)) {\r
-    //\r
-    // parse it for blocksize option\r
-    //\r
-    Ptr = FindOption (\r
-            BlockSizeOp,\r
-            sizeof (BlockSizeOp),\r
-            u.OAck2Ptr.OpAck[0].Option,\r
-            ReplyLen += sizeof (u.Ack2Ptr.BlockNum)\r
-            );\r
-    *PacketSizePtr = (Ptr) ? AtoU (Ptr) : 512;\r
-  }\r
-  //\r
-  // or ACK\r
-  //\r
-  else if (u.Ack2Ptr.OpCode == HTONS (TFTP_ACK)) {\r
-    //\r
-    // option was not supported\r
-    //\r
-    *PacketSizePtr = 512;\r
-  } else {\r
-    return EFI_PROTOCOL_ERROR;\r
-  }\r
-  //\r
-  // loop\r
-  //\r
-  Header.OpCode   = HTONS (TFTP_DATA);\r
-  BlockNum        = 1;\r
-  Header.BlockNum = HTONS (1);\r
-\r
-  do {\r
-    UINTN HeaderSize;\r
-    INTN  Retries;\r
-\r
-    Retries     = NUM_ACK_RETRIES;\r
-    HeaderSize  = sizeof (Header);\r
-    TransferLen = (UINTN) (MIN (*PacketSizePtr, TransferSize));\r
-\r
-    //\r
-    // write a data packet and get an ack\r
-    //\r
-    do {\r
-      //\r
-      // write\r
-      //\r
-      if ((Status = UdpWrite (\r
-                      Private,\r
-                      EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT,\r
-                      ServerIpPtr,\r
-                      &ServerReplyPort,\r
-                      0,\r
-                      0,\r
-                      &OurPort,\r
-                      &HeaderSize,\r
-                      &Header,\r
-                      &TransferLen,\r
-                      BufferPtr\r
-                      )) != EFI_SUCCESS) {\r
-        return Status;\r
-      }\r
-      //\r
-      // read reply\r
-      //\r
-      ReplyLen = sizeof (u.Datastr.Data);\r
-\r
-      if ((Status = TftpUdpRead (\r
-                      Private,\r
-                      0,\r
-                      &u,\r
-                      &ReplyLen,\r
-                      u.Datastr.Data,\r
-                      ServerIpPtr,\r
-                      &ServerReplyPort,\r
-                      0,\r
-                      &OurPort,\r
-                      ACK_TIMEOUT\r
-                      )) == EFI_SUCCESS) {\r
-        //\r
-        // check for ACK for this data packet\r
-        //\r
-        if (u.Ack2Ptr.OpCode != HTONS (TFTP_ACK)) {\r
-          return EFI_PROTOCOL_ERROR;\r
-        }\r
-\r
-        if (u.Ack2Ptr.BlockNum != Header.BlockNum) {\r
-          //\r
-          // not for this packet - continue\r
-          //\r
-          Status = EFI_TIMEOUT;\r
-        }\r
-      }\r
-    } while (Status == EFI_TIMEOUT && --Retries);\r
-\r
-    if (Status != EFI_SUCCESS) {\r
-      return Status;\r
-    }\r
-\r
-    BufferPtr = (VOID *) ((UINT8 *) (BufferPtr) + TransferLen);\r
-    TransferSize -= TransferLen;\r
-    ++BlockNum;\r
-    Header.BlockNum = HTONS ((UINT16) BlockNum);\r
-  } while (TransferLen == *PacketSizePtr);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return *  EFI_INVALID_PARAMETER\r
-  @return *  EFI_OUT_OF_RESOURCES\r
-  @return *  EFI_BAD_BUFFER_SIZE\r
-  @return *  Status is also returned from IpFilter(), TftpInfo(), MtftpDownload(),\r
-  @return *  TftpDownload() and TftpUpload().\r
-\r
-**/\r
-EFI_STATUS\r
-PxeBcMtftp (\r
-  PXE_BASECODE_DEVICE               *Private,\r
-  IN EFI_PXE_BASE_CODE_TFTP_OPCODE  Operation,\r
-  UINT64                            *BufferSizePtr,\r
-  VOID                              *BufferPtr,\r
-  EFI_IP_ADDRESS                    *ServerIpPtr,\r
-  UINT8                             *FilenamePtr,\r
-  UINTN                             *PacketSizePtr,\r
-  IN EFI_PXE_BASE_CODE_MTFTP_INFO   *MtftpInfoPtr, OPTIONAL\r
-  IN BOOLEAN                        Overwrite,\r
-  IN BOOLEAN                        DontUseBuffer\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_IP_FILTER Filter;\r
-  EFI_STATUS                  StatCode;\r
-  EFI_STATUS                  Status;\r
-  UINT64                      BufferSizeLocal;\r
-  UINTN                       PacketSize;\r
-  UINT8                       *BufferPtrLocal;\r
-\r
-  Filter.Filters  = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;\r
-  Filter.IpCnt    = 0;\r
-  Filter.reserved = 0;\r
-\r
-  /* No error has occurred, yet. */\r
-  Private->EfiBc.Mode->TftpErrorReceived = FALSE;\r
-\r
-  /* We must at least have an MTFTP server IP address and\r
-   * a pointer to the buffer size.\r
-   */\r
-  if (!ServerIpPtr || !BufferSizePtr) {\r
-    DEBUG ((DEBUG_WARN, "\nPxeBcMtftp()  Exit #1"));\r
-\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private->Function = EFI_PXE_BASE_CODE_FUNCTION_MTFTP;\r
-\r
-  //\r
-  // make sure filter set to unicast at start\r
-  //\r
-  if ((StatCode = IpFilter (Private, &Filter)) != EFI_SUCCESS) {\r
-    DEBUG (\r
-      (DEBUG_NET,\r
-      "\nPxeBcMtftp()  Exit  IpFilter() == %Xh",\r
-      StatCode)\r
-      );\r
-\r
-    return StatCode;\r
-  }\r
-  //\r
-  // set unset parms to default values\r
-  //\r
-  if (!PacketSizePtr) {\r
-    *(PacketSizePtr = &PacketSize) = MAX_TFTP_PKT_SIZE;\r
-  }\r
-\r
-  if ((*PacketSizePtr > *BufferSizePtr) &&\r
-    (Operation != EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE) &&\r
-    (Operation != EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE)) {\r
-    *PacketSizePtr = MAX ((UINTN) *BufferSizePtr, MIN_TFTP_PKT_SIZE);\r
-  }\r
-\r
-  if (*PacketSizePtr < MIN_TFTP_PKT_SIZE) {\r
-    *PacketSizePtr = MIN_TFTP_PKT_SIZE;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (*PacketSizePtr > BUFFER_ALLOCATE_SIZE) {\r
-    *PacketSizePtr = BUFFER_ALLOCATE_SIZE;\r
-  }\r
-\r
-  if (*PacketSizePtr > MAX_TFTP_PKT_SIZE) {\r
-    *PacketSizePtr = MAX_TFTP_PKT_SIZE;\r
-  }\r
-\r
-  if (Operation == EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE) {\r
-    StatCode = TftpInfo (\r
-                Private,\r
-                BufferSizePtr,\r
-                ServerIpPtr,\r
-                TftpRequestPort,\r
-                FilenamePtr,\r
-                PacketSizePtr\r
-                );\r
-\r
-    if (StatCode != EFI_SUCCESS) {\r
-      DEBUG (\r
-        (DEBUG_WARN,\r
-        "\nPxeBcMtftp()  Exit  TftpInfo() == %Xh",\r
-        StatCode)\r
-        );\r
-    }\r
-\r
-    return StatCode;\r
-  }\r
-\r
-  if (Operation == EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE) {\r
-    if (!MtftpInfoPtr || !MtftpInfoPtr->SPort) {\r
-      DEBUG ((DEBUG_WARN, "\nPxeBcMtftp()  Exit #2"));\r
-      return EFI_INVALID_PARAMETER;\r
-    } else {\r
-      StatCode = TftpInfo (\r
-                  Private,\r
-                  BufferSizePtr,\r
-                  ServerIpPtr,\r
-                  MtftpInfoPtr->SPort,\r
-                  FilenamePtr,\r
-                  PacketSizePtr\r
-                  );\r
-\r
-      gBS->Stall (10000);\r
-\r
-      if (StatCode != EFI_SUCCESS) {\r
-        DEBUG (\r
-          (DEBUG_WARN,\r
-          "\nPxeBcMtftp()  Exit  TftpInfo() == %Xh",\r
-          StatCode)\r
-          );\r
-      }\r
-\r
-      return StatCode;\r
-    }\r
-  }\r
-\r
-  if (!BufferPtr && !DontUseBuffer) {\r
-    //\r
-    // if dontusebuffer is false and no buffer???\r
-    //\r
-    DEBUG ((DEBUG_WARN, "\nPxeBcMtftp()  Exit #3"));\r
-    //\r
-    // DontUseBuffer can be true only for read_file operation\r
-    //\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (DontUseBuffer) {\r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    BUFFER_ALLOCATE_SIZE,\r
-                    (VOID **) &BufferPtrLocal\r
-                    );\r
-\r
-    if (EFI_ERROR (Status) || BufferPtrLocal == NULL) {\r
-      DEBUG ((DEBUG_NET, "\nPxeBcMtftp()  Exit #4"));\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-    BufferSizeLocal = BUFFER_ALLOCATE_SIZE;\r
-  } else {\r
-    if (!*BufferSizePtr && Operation != EFI_PXE_BASE_CODE_TFTP_WRITE_FILE) {\r
-      DEBUG ((DEBUG_WARN, "\nPxeBcMtftp()  Exit #5"));\r
-      return EFI_BAD_BUFFER_SIZE;\r
-    }\r
-\r
-    BufferPtrLocal  = BufferPtr;\r
-    BufferSizeLocal = *BufferSizePtr;\r
-  }\r
-\r
-  switch (Operation) {\r
-  case EFI_PXE_BASE_CODE_MTFTP_READ_FILE:\r
-    if (FilenamePtr == NULL ||\r
-        MtftpInfoPtr == NULL ||\r
-        MtftpInfoPtr->MCastIp.Addr[0] == 0 ||\r
-        MtftpInfoPtr->SPort == 0 ||\r
-        MtftpInfoPtr->CPort == 0 ||\r
-        MtftpInfoPtr->ListenTimeout == 0 ||\r
-        MtftpInfoPtr->TransmitTimeout == 0\r
-        ) {\r
-      StatCode = EFI_INVALID_PARAMETER;\r
-      break;\r
-    }\r
-    //\r
-    // try MTFTP - if fails, drop into TFTP read\r
-    //\r
-    if ((StatCode = MtftpDownload (\r
-                      Private,\r
-                      &BufferSizeLocal,\r
-                      BufferPtrLocal,\r
-                      ServerIpPtr,\r
-                      FilenamePtr,\r
-                      MtftpInfoPtr,\r
-                      DontUseBuffer\r
-                      )) == EFI_SUCCESS || StatCode == EFI_BUFFER_TOO_SMALL) {\r
-      if (BufferSizePtr /* %% !DontUseBuffer */ ) {\r
-        *BufferSizePtr = BufferSizeLocal;\r
-      }\r
-\r
-      break;\r
-    }\r
-    //\r
-    // go back to unicast\r
-    //\r
-    if ((StatCode = IpFilter (Private, &Filter)) != EFI_SUCCESS) {\r
-      break;\r
-    }\r
-\r
-  /* fall thru */\r
-  case EFI_PXE_BASE_CODE_TFTP_READ_FILE:\r
-    if (FilenamePtr == NULL) {\r
-      StatCode = EFI_INVALID_PARAMETER;\r
-      break;\r
-    }\r
-\r
-    StatCode = TftpDownload (\r
-                Private,\r
-                &BufferSizeLocal,\r
-                BufferPtrLocal,\r
-                ServerIpPtr,\r
-                FilenamePtr,\r
-                PacketSizePtr,\r
-                TftpRequestPort,\r
-                TFTP_RRQ,\r
-                DontUseBuffer\r
-                );\r
-\r
-    if (StatCode == EFI_SUCCESS || StatCode == EFI_BUFFER_TOO_SMALL) {\r
-      if (BufferSizePtr /* !DontUseBuffer */ ) {\r
-        *BufferSizePtr = BufferSizeLocal;\r
-      }\r
-    }\r
-\r
-    break;\r
-\r
-  case EFI_PXE_BASE_CODE_TFTP_WRITE_FILE:\r
-    if (FilenamePtr == NULL || DontUseBuffer) {\r
-      //\r
-      // not a valid option\r
-      //\r
-      StatCode = EFI_INVALID_PARAMETER;\r
-      break;\r
-    }\r
-\r
-    StatCode = TftpUpload (\r
-                Private,\r
-                BufferSizePtr,\r
-                BufferPtr,\r
-                ServerIpPtr,\r
-                FilenamePtr,\r
-                PacketSizePtr,\r
-                Overwrite\r
-                );\r
-\r
-    if (StatCode != EFI_SUCCESS) {\r
-      DEBUG (\r
-        (DEBUG_WARN,\r
-        "\nPxeBcMtftp()  Exit #6  %xh (%r)",\r
-        StatCode,\r
-        StatCode)\r
-        );\r
-    }\r
-\r
-    return StatCode;\r
-\r
-  case EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY:\r
-    if (FilenamePtr == NULL || DontUseBuffer) {\r
-      //\r
-      // not a valid option\r
-      //\r
-      StatCode = EFI_INVALID_PARAMETER;\r
-      break;\r
-    }\r
-\r
-    StatCode = TftpDownload (\r
-                Private,\r
-                BufferSizePtr,\r
-                BufferPtr,\r
-                ServerIpPtr,\r
-                FilenamePtr,\r
-                PacketSizePtr,\r
-                TftpRequestPort,\r
-                TFTP_DIR,\r
-                DontUseBuffer\r
-                );\r
-\r
-    if (StatCode != EFI_SUCCESS) {\r
-      DEBUG (\r
-        (DEBUG_WARN,\r
-        "\nPxeBcMtftp()  Exit #7  %xh (%r)",\r
-        StatCode,\r
-        StatCode)\r
-        );\r
-    }\r
-\r
-    return StatCode;\r
-\r
-  case EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY:\r
-    if (DontUseBuffer) {\r
-      StatCode = EFI_INVALID_PARAMETER;\r
-      break;\r
-    }\r
-\r
-    if (MtftpInfoPtr == NULL || !MtftpInfoPtr->SPort) {\r
-      DEBUG (\r
-        (DEBUG_WARN,\r
-        "\nPxeBcMtftp()  Exit #9  %xh (%r)",\r
-        EFI_INVALID_PARAMETER,\r
-        EFI_INVALID_PARAMETER)\r
-        );\r
-\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    StatCode = TftpDownload (\r
-                Private,\r
-                BufferSizePtr,\r
-                BufferPtr,\r
-                ServerIpPtr,\r
-                (UINT8 *) "/",\r
-                PacketSizePtr,\r
-                MtftpInfoPtr->SPort,\r
-                TFTP_DIR,\r
-                DontUseBuffer\r
-                );\r
-\r
-    break;\r
-\r
-  default:\r
-    StatCode = EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (DontUseBuffer) {\r
-    gBS->FreePool (BufferPtrLocal);\r
-  }\r
-\r
-  if (StatCode != EFI_SUCCESS) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nPxeBcMtftp()  Exit #8  %xh (%r)",\r
-      StatCode,\r
-      StatCode)\r
-      );\r
-  }\r
-\r
-  gBS->Stall (10000);\r
-\r
-  return StatCode;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return *  EFI_INVALID_PARAMETER\r
-  @return *  Status is also returned from PxeBcMtftp();\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcMtftp (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL       * This,\r
-  IN EFI_PXE_BASE_CODE_TFTP_OPCODE    Operation,\r
-  IN OUT VOID                         *BufferPtr,\r
-  IN BOOLEAN                          Overwrite,\r
-  IN OUT UINT64                       *BufferSizePtr,\r
-  IN UINTN                            *BlockSizePtr OPTIONAL,\r
-  IN EFI_IP_ADDRESS                   * ServerIpPtr,\r
-  IN UINT8                            *FilenamePtr,\r
-  IN EFI_PXE_BASE_CODE_MTFTP_INFO     * MtftpInfoPtr OPTIONAL,\r
-  IN BOOLEAN                          DontUseBuffer\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_IP_FILTER Filter;\r
-  EFI_STATUS                  StatCode;\r
-  PXE_BASECODE_DEVICE         *Private;\r
-\r
-  //\r
-  // Lock the instance data and make sure started\r
-  //\r
-  StatCode = EFI_SUCCESS;\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE poiner == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (!IS_INADDR_UNICAST (ServerIpPtr)) {\r
-      //\r
-      // The station IP is not a unicast address.\r
-      //\r
-      return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  if (This->Mode == NULL || !This->Mode->Started) {\r
-    DEBUG ((DEBUG_ERROR, "BC was not started."));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_NOT_STARTED;\r
-  }\r
-  //\r
-  // Issue BC command\r
-  //\r
-  Filter.Filters  = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;\r
-  Filter.IpCnt    = 0;\r
-  Filter.reserved = 0;\r
-\r
-  DEBUG ((DEBUG_WARN, "\nBcMtftp()  Op=%d  Buf=%Xh", Operation, BufferPtr));\r
-\r
-  StatCode = PxeBcMtftp (\r
-              Private,\r
-              Operation,\r
-              BufferSizePtr,\r
-              BufferPtr,\r
-              ServerIpPtr,\r
-              FilenamePtr,\r
-              BlockSizePtr,\r
-              MtftpInfoPtr,\r
-              Overwrite,\r
-              DontUseBuffer\r
-              );\r
-\r
-  //\r
-  // restore to unicast\r
-  //\r
-  IpFilter (Private, &Filter);\r
-\r
-  //\r
-  // Unlock the instance data\r
-  //\r
-  EfiReleaseLock (&Private->Lock);\r
-  return StatCode;\r
-}\r
-\r
-/* eof - PxeBcMtftp.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_udp.c b/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_bc_udp.c
deleted file mode 100644 (file)
index 76594f5..0000000
+++ /dev/null
@@ -1,509 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  pxe_bc_udp.c\r
-\r
-Abstract:\r
-\r
-\r
-**/\r
-\r
-#include "Bc.h"\r
-\r
-//\r
-// //////////////////////////////////////////////////////////////////////\r
-//\r
-//  Udp Write Routine - called by base code - e.g. TFTP - already locked\r
-//\r
-\r
-/**\r
-\r
-  @return EFI_SUCCESS :=\r
-  @return EFI_INVALID_PARAMETER :=\r
-  @return other :=\r
-\r
-**/\r
-EFI_STATUS\r
-UdpWrite (\r
-  IN PXE_BASECODE_DEVICE            *Private,\r
-  IN UINT16                         OpFlags,\r
-  IN EFI_IP_ADDRESS                 *DestIpPtr,\r
-  IN EFI_PXE_BASE_CODE_UDP_PORT     *DestPortPtr,\r
-  IN EFI_IP_ADDRESS                 *GatewayIpPtr, OPTIONAL\r
-  IN EFI_IP_ADDRESS                 *SrcIpPtr, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL\r
-  IN UINTN                          *HeaderSizePtr, OPTIONAL\r
-  IN VOID                           *HeaderPtr, OPTIONAL\r
-  IN UINTN                          *BufferSizeptr,\r
-  IN VOID                           *BufferPtr\r
-  )\r
-{\r
-  UINTN                       TotalLength;\r
-  UINTN                       HeaderSize;\r
-  EFI_PXE_BASE_CODE_UDP_PORT  DefaultSrcPort;\r
-\r
-  //\r
-  //\r
-  //\r
-  HeaderSize      = (HeaderSizePtr != NULL) ? *HeaderSizePtr : 0;\r
-  DefaultSrcPort  = 0;\r
-\r
-  //\r
-  // check parameters\r
-  //\r
-  if (BufferSizeptr == NULL ||\r
-      BufferPtr == NULL ||\r
-      DestIpPtr == NULL ||\r
-      DestPortPtr == NULL ||\r
-      (HeaderSizePtr != NULL && *HeaderSizePtr == 0) ||\r
-      (HeaderSize != 0 && HeaderPtr == NULL) ||\r
-      (GatewayIpPtr != NULL && !IS_INADDR_UNICAST(GatewayIpPtr)) ||\r
-      (OpFlags &~(EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT | EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT))\r
-      ) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nUdpWrite()  Exit #1  %xh (%r)",\r
-      EFI_INVALID_PARAMETER,\r
-      EFI_INVALID_PARAMETER)\r
-      );\r
-\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  TotalLength = *BufferSizeptr + HeaderSize + sizeof (UDPV4_HEADER);\r
-\r
-  if (TotalLength > 0x0000ffff) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nUdpWrite()  Exit #2  %xh (%r)",\r
-      EFI_BAD_BUFFER_SIZE,\r
-      EFI_BAD_BUFFER_SIZE)\r
-      );\r
-\r
-    return EFI_BAD_BUFFER_SIZE;\r
-  }\r
-\r
-  if (SrcIpPtr == NULL) {\r
-    SrcIpPtr = &Private->EfiBc.Mode->StationIp;\r
-  }\r
-\r
-  if (SrcPortPtr == NULL) {\r
-    SrcPortPtr = &DefaultSrcPort;\r
-    OpFlags |= EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT;\r
-  }\r
-\r
-  if (OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) {\r
-    *SrcPortPtr = Private->RandomPort;\r
-\r
-    if (++Private->RandomPort == 0) {\r
-      Private->RandomPort = PXE_RND_PORT_LOW;\r
-    }\r
-  }\r
-\r
-#define IpTxBuffer  ((IPV4_BUFFER *) Private->TransmitBufferPtr)\r
-  //\r
-  // build pseudo header and udp header in transmit buffer\r
-  //\r
-#define Udpv4Base ((UDPV4_HEADERS *) (IpTxBuffer->u.Data - sizeof (UDPV4_PSEUDO_HEADER)))\r
-\r
-  Udpv4Base->Udpv4PseudoHeader.SrcAddr.L    = SrcIpPtr->Addr[0];\r
-  Udpv4Base->Udpv4PseudoHeader.DestAddr.L   = DestIpPtr->Addr[0];\r
-  Udpv4Base->Udpv4PseudoHeader.Zero         = 0;\r
-  Udpv4Base->Udpv4PseudoHeader.Protocol     = PROT_UDP;\r
-  Udpv4Base->Udpv4PseudoHeader.TotalLength  = HTONS (TotalLength);\r
-  Udpv4Base->Udpv4Header.SrcPort            = HTONS (*SrcPortPtr);\r
-  Udpv4Base->Udpv4Header.DestPort           = HTONS (*DestPortPtr);\r
-  Udpv4Base->Udpv4Header.TotalLength        = Udpv4Base->Udpv4PseudoHeader.TotalLength;\r
-  Udpv4Base->Udpv4Header.Checksum           = 0;\r
-\r
-  if (HeaderSize != 0) {\r
-    CopyMem (IpTxBuffer->u.Udp.Data, HeaderPtr, HeaderSize);\r
-  }\r
-\r
-  HeaderSize += sizeof (UDPV4_HEADER);\r
-\r
-  Udpv4Base->Udpv4Header.Checksum = IpChecksum2 (\r
-                                      (UINT16 *) Udpv4Base,\r
-                                      HeaderSize + sizeof (UDPV4_PSEUDO_HEADER),\r
-                                      (UINT16 *) BufferPtr,\r
-                                      (UINT16) *BufferSizeptr\r
-                                      );\r
-\r
-  if (Udpv4Base->Udpv4Header.Checksum == 0) {\r
-    Udpv4Base->Udpv4Header.Checksum = 0xffff;\r
-    //\r
-    // transmit zero checksum as ones complement\r
-    //\r
-  }\r
-\r
-  return Ip4Send (\r
-          Private,\r
-          OpFlags,\r
-          PROT_UDP,\r
-          Udpv4Base->Udpv4PseudoHeader.SrcAddr.L,\r
-          Udpv4Base->Udpv4PseudoHeader.DestAddr.L,\r
-          (GatewayIpPtr) ? GatewayIpPtr->Addr[0] : 0,\r
-          HeaderSize,\r
-          BufferPtr,\r
-          *BufferSizeptr\r
-          );\r
-}\r
-//\r
-// //////////////////////////////////////////////////////////\r
-//\r
-//  BC Udp Write Routine\r
-//\r
-\r
-/**\r
-\r
-  @return EFI_SUCCESS :=\r
-  @return other :=\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcUdpWrite (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL     *This,\r
-  IN UINT16                         OpFlags,\r
-  IN EFI_IP_ADDRESS                 *DestIpPtr,\r
-  IN EFI_PXE_BASE_CODE_UDP_PORT     *DestPortPtr,\r
-  IN EFI_IP_ADDRESS                 *GatewayIpPtr, OPTIONAL\r
-  IN EFI_IP_ADDRESS                 *SrcIpPtr, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL\r
-  IN UINTN                          *HeaderSizePtr, OPTIONAL\r
-  IN VOID                           *HeaderPtr, OPTIONAL\r
-  IN UINTN                          *BufferSizeptr,\r
-  IN VOID                           *BufferPtr\r
-  )\r
-{\r
-  EFI_STATUS          StatCode;\r
-  PXE_BASECODE_DEVICE *Private;\r
-\r
-  //\r
-  // Lock the instance data and make sure started\r
-  //\r
-  StatCode = EFI_SUCCESS;\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE poiner == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  if (This->Mode == NULL || !This->Mode->Started) {\r
-    DEBUG ((DEBUG_ERROR, "BC was not started."));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  Private->Function = EFI_PXE_BASE_CODE_FUNCTION_UDP_WRITE;\r
-\r
-  //\r
-  // Issue BC command\r
-  //\r
-  StatCode = UdpWrite (\r
-              Private,\r
-              OpFlags,\r
-              DestIpPtr,\r
-              DestPortPtr,\r
-              GatewayIpPtr,\r
-              SrcIpPtr,\r
-              SrcPortPtr,\r
-              HeaderSizePtr,\r
-              HeaderPtr,\r
-              BufferSizeptr,\r
-              BufferPtr\r
-              );\r
-\r
-  //\r
-  // Unlock the instance data\r
-  //\r
-  EfiReleaseLock (&Private->Lock);\r
-  return StatCode;\r
-}\r
-//\r
-// /////////////////////////////////////////////////////////////////////\r
-//\r
-//  Udp Read Routine - called by base code - e.g. TFTP - already locked\r
-//\r
-\r
-/**\r
-\r
-  @return EFI_SUCCESS :=\r
-  @return EFI_INVALID_PARAMETER :=\r
-  @return other :=\r
-\r
-**/\r
-EFI_STATUS\r
-UdpRead (\r
-  IN PXE_BASECODE_DEVICE            *Private,\r
-  IN UINT16                         OpFlags,\r
-  IN OUT EFI_IP_ADDRESS             *DestIpPtr, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPortPtr, OPTIONAL\r
-  IN OUT EFI_IP_ADDRESS             *SrcIpPtr, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPortPtr, OPTIONAL\r
-  IN UINTN                          *HeaderSizePtr, OPTIONAL\r
-  IN VOID                           *HeaderPtr, OPTIONAL\r
-  IN OUT UINTN                      *BufferSizeptr,\r
-  IN VOID                           *BufferPtr,\r
-  EFI_EVENT                         TimeoutEvent\r
-  )\r
-{\r
-  EFI_STATUS      StatCode;\r
-  EFI_IP_ADDRESS  TmpSrcIp;\r
-  EFI_IP_ADDRESS  TmpDestIp;\r
-  UINTN           BufferSize;\r
-  UINTN           HeaderSize;\r
-\r
-  //\r
-  // combination structure of pseudo header/udp header\r
-  //\r
-#pragma pack (1)\r
-  struct {\r
-    UDPV4_PSEUDO_HEADER Udpv4PseudoHeader;\r
-    UDPV4_HEADER        Udpv4Header;\r
-    UINT8               ProtHdr[64];\r
-  } Hdrs;\r
-#pragma pack ()\r
-\r
-  HeaderSize = (HeaderSizePtr != NULL) ? *HeaderSizePtr : 0;\r
-  //\r
-  // read [with filtering]\r
-  // check parameters\r
-  //\r
-  if (BufferSizeptr == NULL ||\r
-      BufferPtr == NULL ||\r
-      (HeaderSize != 0 && HeaderPtr == NULL) ||\r
-      (OpFlags &~UDP_FILTER_MASK)\r
-      //\r
-      // if filtering on a particular IP/Port, need it\r
-      //\r
-      ||\r
-      (!(OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP) && SrcIpPtr == NULL) ||\r
-      (!(OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) && SrcPortPtr == NULL) ||\r
-      (!(OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) && DestPortPtr == NULL)\r
-      ) {\r
-    DEBUG ((DEBUG_INFO, "\nUdpRead()  Exit #1  Invalid Parameter"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  // in case we loop\r
-  //\r
-  BufferSize = *BufferSizeptr;\r
-  //\r
-  // we need source and dest IPs for pseudo header\r
-  //\r
-  if (SrcIpPtr == NULL) {\r
-    SrcIpPtr = &TmpSrcIp;\r
-  }\r
-\r
-  if (DestIpPtr == NULL) {\r
-    DestIpPtr = &TmpDestIp;\r
-    CopyMem (&TmpDestIp, &Private->EfiBc.Mode->StationIp, sizeof (EFI_IP_ADDRESS));\r
-  }\r
-\r
-  for (;;) {\r
-    *BufferSizeptr = BufferSize;\r
-\r
-    StatCode = IpReceive (\r
-                Private,\r
-                OpFlags,\r
-                SrcIpPtr,\r
-                DestIpPtr,\r
-                PROT_UDP,\r
-                &Hdrs.Udpv4Header,\r
-                HeaderSize + sizeof Hdrs.Udpv4Header,\r
-                BufferPtr,\r
-                BufferSizeptr,\r
-                TimeoutEvent\r
-                );\r
-\r
-    if (StatCode == EFI_SUCCESS || StatCode == EFI_BUFFER_TOO_SMALL) {\r
-      UINT16  SPort;\r
-      UINT16  DPort;\r
-\r
-      SPort = NTOHS (Hdrs.Udpv4Header.SrcPort);\r
-      DPort = NTOHS (Hdrs.Udpv4Header.DestPort);\r
-\r
-      //\r
-      // do filtering\r
-      //\r
-      if (!(OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) && *SrcPortPtr != SPort) {\r
-        continue;\r
-      }\r
-\r
-      if (!(OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) && *DestPortPtr != DPort) {\r
-        continue;\r
-      }\r
-      //\r
-      // check checksum\r
-      //\r
-      if (StatCode == EFI_SUCCESS && Hdrs.Udpv4Header.Checksum) {\r
-        Hdrs.Udpv4PseudoHeader.SrcAddr.L    = SrcIpPtr->Addr[0];\r
-        Hdrs.Udpv4PseudoHeader.DestAddr.L   = DestIpPtr->Addr[0];\r
-        Hdrs.Udpv4PseudoHeader.Zero         = 0;\r
-        Hdrs.Udpv4PseudoHeader.Protocol     = PROT_UDP;\r
-        Hdrs.Udpv4PseudoHeader.TotalLength  = Hdrs.Udpv4Header.TotalLength;\r
-\r
-        if (Hdrs.Udpv4Header.Checksum == 0xffff) {\r
-          Hdrs.Udpv4Header.Checksum = 0;\r
-        }\r
-\r
-        if (IpChecksum2 (\r
-              (UINT16 *) &Hdrs.Udpv4PseudoHeader,\r
-              HeaderSize + sizeof (Hdrs.Udpv4PseudoHeader) + sizeof (Hdrs.Udpv4Header),\r
-              (UINT16 *) BufferPtr,\r
-              *BufferSizeptr\r
-              )) {\r
-          DEBUG (\r
-            (DEBUG_INFO,\r
-            "\nUdpRead()  Hdrs.Udpv4PseudoHeader == %Xh",\r
-            &Hdrs.Udpv4PseudoHeader)\r
-            );\r
-          DEBUG (\r
-            (DEBUG_INFO,\r
-            "\nUdpRead()  Header size == %d",\r
-            HeaderSize + sizeof (Hdrs.Udpv4PseudoHeader))\r
-            );\r
-          DEBUG (\r
-            (DEBUG_INFO,\r
-            "\nUdpRead()  BufferPtr == %Xh",\r
-            BufferPtr)\r
-            );\r
-          DEBUG (\r
-            (DEBUG_INFO,\r
-            "\nUdpRead()  Buffer size == %d",\r
-            *BufferSizeptr)\r
-            );\r
-          DEBUG ((DEBUG_INFO, "\nUdpRead()  Exit #2  Device Error"));\r
-          return EFI_DEVICE_ERROR;\r
-        }\r
-      }\r
-      //\r
-      // all passed\r
-      //\r
-      if (SrcPortPtr != NULL) {\r
-        *SrcPortPtr = SPort;\r
-      }\r
-\r
-      if (DestPortPtr != NULL) {\r
-        *DestPortPtr = DPort;\r
-      }\r
-\r
-      if (HeaderSize != 0) {\r
-        CopyMem (HeaderPtr, Hdrs.ProtHdr, HeaderSize);\r
-      }\r
-    }\r
-\r
-    if ((StatCode != EFI_SUCCESS) && (StatCode != EFI_TIMEOUT)) {\r
-      DEBUG (\r
-        (DEBUG_INFO,\r
-        "\nUdpRead()  Exit #3  %Xh %r",\r
-        StatCode,\r
-        StatCode)\r
-        );\r
-    }\r
-\r
-    return StatCode;\r
-  }\r
-}\r
-//\r
-// //////////////////////////////////////////////////////////\r
-//\r
-//  BC Udp Read Routine\r
-//\r
-\r
-/**\r
-\r
-  @return EFI_SUCCESS :=\r
-  @return other :=\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BcUdpRead (\r
-  IN EFI_PXE_BASE_CODE_PROTOCOL     *This,\r
-  IN UINT16                         OpFlags,\r
-  IN OUT EFI_IP_ADDRESS             *DestIp, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort, OPTIONAL\r
-  IN OUT EFI_IP_ADDRESS             *SrcIp, OPTIONAL\r
-  IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL\r
-  IN UINTN                          *HeaderSize, OPTIONAL\r
-  IN VOID                           *HeaderPtr, OPTIONAL\r
-  IN OUT UINTN                      *BufferSize,\r
-  IN VOID                           *BufferPtr\r
-  )\r
-{\r
-  EFI_STATUS          StatCode;\r
-  PXE_BASECODE_DEVICE *Private;\r
-\r
-  //\r
-  // Lock the instance data and make sure started\r
-  //\r
-  StatCode = EFI_SUCCESS;\r
-\r
-  if (This == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "BC *This pointer == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = CR (This, PXE_BASECODE_DEVICE, EfiBc, PXE_BASECODE_DEVICE_SIGNATURE);\r
-\r
-  if (Private == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "PXE_BASECODE_DEVICE poiner == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  if (This->Mode == NULL || !This->Mode->Started) {\r
-    DEBUG ((DEBUG_ERROR, "BC was not started."));\r
-    EfiReleaseLock (&Private->Lock);\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  Private->Function = EFI_PXE_BASE_CODE_FUNCTION_UDP_READ;\r
-\r
-  //\r
-  // Issue BC command\r
-  //\r
-  StatCode = UdpRead (\r
-              Private,\r
-              OpFlags,\r
-              DestIp,\r
-              DestPort,\r
-              SrcIp,\r
-              SrcPort,\r
-              HeaderSize,\r
-              HeaderPtr,\r
-              BufferSize,\r
-              BufferPtr,\r
-              0\r
-              );\r
-\r
-  //\r
-  // Unlock the instance data and return\r
-  //\r
-  EfiReleaseLock (&Private->Lock);\r
-  return StatCode;\r
-}\r
-\r
-/* eof - pxe_bc_udp.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_loadfile.c b/MdeModulePkg/Universal/Network/PxeBcDxe/Pxe_loadfile.c
deleted file mode 100644 (file)
index a15b873..0000000
+++ /dev/null
@@ -1,1605 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  pxe_loadfile.c\r
-\r
-Abstract:\r
-  An implementation of the load file protocol for network devices.\r
-\r
-\r
-**/\r
-\r
-\r
-#include "Bc.h"\r
-\r
-#define DO_MENU     (EFI_SUCCESS)\r
-#define NO_MENU     (DO_MENU + 1)\r
-#define LOCAL_BOOT  (EFI_ABORTED)\r
-#define AUTO_SELECT (NO_MENU)\r
-\r
-#define NUMBER_ROWS   25  // we set to mode 0\r
-#define MAX_MENULIST  23\r
-\r
-#define Ctl(x)  (0x1F & (x))\r
-\r
-typedef union {\r
-  DHCPV4_OP_STRUCT          *OpPtr;\r
-  PXE_BOOT_MENU_ENTRY       *CurrentMenuItemPtr;\r
-  PXE_OP_DISCOVERY_CONTROL  *DiscCtlOpStr;\r
-  PXE_OP_BOOT_MENU          *MenuPtr;\r
-  UINT8                     *BytePtr;\r
-} UNION_PTR;\r
-\r
-UINTN  mPropeller;\r
-\r
-/**\r
-  PxeBc callback routine for status updates and aborts.\r
-\r
-  @param  This                                        Pointer to PxeBcCallback\r
-                                                      interface\r
-  @param  Function                                    PxeBc function ID#\r
-  @param  Received                                    Receive/transmit flag\r
-  @param  PacketLength                                Length of received packet (0\r
-                                                      == idle callback)\r
-  @param  PacketPtr                                   Pointer to received packet\r
-                                                      (NULL == idle callback)\r
-\r
-  @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE\r
-                                                      EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT\r
-                                                      -\r
-\r
-**/\r
-EFI_PXE_BASE_CODE_CALLBACK_STATUS\r
-EFIAPI\r
-bc_callback (\r
-  IN EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL  * This,\r
-  IN EFI_PXE_BASE_CODE_FUNCTION           Function,\r
-  IN BOOLEAN                              Received,\r
-  IN UINT32                               PacketLength,\r
-  IN EFI_PXE_BASE_CODE_PACKET             * PacketPtr OPTIONAL\r
-  )\r
-{\r
-  EFI_INPUT_KEY Key;\r
-  UINTN         Row;\r
-  UINTN         Col;\r
-\r
-  mPropeller = 0;\r
-  //\r
-  // Resolve Warning 4 unreferenced parameter problem\r
-  //\r
-  This = This;\r
-\r
-  //\r
-  // Check for user abort.\r
-  //\r
-  if (gST->ConIn->ReadKeyStroke (gST->ConIn, &Key) == EFI_SUCCESS) {\r
-    if (!Key.ScanCode) {\r
-      if (Key.UnicodeChar == Ctl ('c')) {\r
-        return EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT;\r
-      }\r
-    } else if (Key.ScanCode == SCAN_ESC) {\r
-      return EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT;\r
-    }\r
-  }\r
-  //\r
-  // Do nothing if this is a receive.\r
-  //\r
-  if (Received) {\r
-    return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;\r
-  }\r
-  //\r
-  // The display code is only for these functions.\r
-  //\r
-  switch (Function) {\r
-  case EFI_PXE_BASE_CODE_FUNCTION_MTFTP:\r
-    //\r
-    // If this is a transmit and not a M/TFTP open request,\r
-    // return now.  Do not print a dot for each M/TFTP packet\r
-    // that is sent, only for the open packets.\r
-    //\r
-    if (PacketLength != 0 && PacketPtr != NULL) {\r
-      if (PacketPtr->Raw[0x1C] != 0x00 || PacketPtr->Raw[0x1D] != 0x01) {\r
-        return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;\r
-      }\r
-    }\r
-\r
-    break;\r
-\r
-  case EFI_PXE_BASE_CODE_FUNCTION_DHCP:\r
-  case EFI_PXE_BASE_CODE_FUNCTION_DISCOVER:\r
-    break;\r
-\r
-  default:\r
-    return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;\r
-  }\r
-  //\r
-  // Display routines\r
-  //\r
-  if (PacketLength != 0 && PacketPtr != NULL) {\r
-    //\r
-    // Display a '.' when a packet is transmitted.\r
-    //\r
-    AsciiPrint (".");\r
-  } else if (PacketLength == 0 && PacketPtr == NULL) {\r
-    //\r
-    // Display a propeller when waiting for packets if at\r
-    // least 200 ms have passed.\r
-    //\r
-    Row = gST->ConOut->Mode->CursorRow;\r
-    Col = gST->ConOut->Mode->CursorColumn;\r
-\r
-    AsciiPrint ("%c", "/-\\|"[mPropeller]);\r
-    gST->ConOut->SetCursorPosition (gST->ConOut, Col, Row);\r
-\r
-    mPropeller = (mPropeller + 1) & 3;\r
-  }\r
-\r
-  return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;\r
-}\r
-\r
-EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL  _bc_callback = {\r
-  EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION,\r
-  &bc_callback\r
-};\r
-\r
-\r
-/**\r
-  Display an IPv4 address in dot notation.\r
-\r
-  @param  Ptr                                         Pointer to IPv4 address.\r
-\r
-  @return None\r
-\r
-**/\r
-VOID\r
-PrintIpv4 (\r
-  UINT8 *Ptr\r
-  )\r
-{\r
-  if (Ptr != NULL) {\r
-    AsciiPrint ("%d.%d.%d.%d", Ptr[0], Ptr[1], Ptr[2], Ptr[3]);\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Display client and server IP information.\r
-\r
-  @param  Private                                     Pointer to PxeBc interface\r
-\r
-  @return None\r
-\r
-**/\r
-VOID\r
-ShowMyInfo (\r
-  IN PXE_BASECODE_DEVICE *Private\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE  *PxeBcMode;\r
-  UINTN                   Index;\r
-\r
-  //\r
-  // Do nothing if a NULL pointer is passed in.\r
-  //\r
-  if (Private == NULL) {\r
-    return ;\r
-  }\r
-  //\r
-  // Get pointer to PXE BaseCode mode structure\r
-  //\r
-  PxeBcMode = Private->EfiBc.Mode;\r
-\r
-  //\r
-  // Display client IP address\r
-  //\r
-  AsciiPrint ("\rCLIENT IP: ");\r
-  PrintIpv4 (PxeBcMode->StationIp.v4.Addr);\r
-\r
-  //\r
-  // Display subnet mask\r
-  //\r
-  AsciiPrint ("  MASK: ");\r
-  PrintIpv4 (PxeBcMode->SubnetMask.v4.Addr);\r
-\r
-  //\r
-  // Display DHCP and proxyDHCP IP addresses\r
-  //\r
-  if (PxeBcMode->ProxyOfferReceived) {\r
-    AsciiPrint ("\nDHCP IP: ");\r
-    PrintIpv4 (((DHCPV4_OP_SERVER_IP *) DHCPV4_ACK_BUFFER.OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1])->Ip.Addr);\r
-\r
-    AsciiPrint ("  PROXY IP: ");\r
-    PrintIpv4 (((DHCPV4_OP_SERVER_IP *) PXE_OFFER_BUFFER.OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1])->Ip.Addr);\r
-  } else {\r
-    AsciiPrint ("  DHCP IP: ");\r
-    PrintIpv4 (((DHCPV4_OP_SERVER_IP *) DHCPV4_ACK_BUFFER.OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1])->Ip.Addr);\r
-  }\r
-  //\r
-  // Display gateway IP addresses\r
-  //\r
-  for (Index = 0; Index < PxeBcMode->RouteTableEntries; ++Index) {\r
-    if ((Index % 3) == 0) {\r
-      AsciiPrint ("\r\nGATEWAY IP:");\r
-    }\r
-\r
-    AsciiPrint (" ");\r
-    PrintIpv4 (PxeBcMode->RouteTable[Index].GwAddr.v4.Addr);\r
-    AsciiPrint (" ");\r
-  }\r
-\r
-  AsciiPrint ("\n");\r
-}\r
-\r
-\r
-/**\r
-  Display prompt and wait for input.\r
-\r
-  @param  Private                                     Pointer to PxeBc interface\r
-  @param  BootPromptPtr                               Pointer to PXE boot prompt\r
-                                                      option\r
-\r
-  @retval AUTO_SELECT                                 DO_MENU -\r
-  @retval NO_MENU\r
-  @retval LOCAL_BOOT\r
-\r
-**/\r
-EFI_STATUS\r
-DoPrompt (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  PXE_OP_BOOT_PROMPT  *BootPromptPtr\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  EFI_EVENT   TimeoutEvent;\r
-  EFI_EVENT   SecondsEvent;\r
-  INT32       SecColumn;\r
-  INT32       SecRow;\r
-  UINT8       SaveChar;\r
-  UINT8       SecsLeft;\r
-\r
-  //\r
-  // if auto select, just get right to it\r
-  //\r
-  if (BootPromptPtr->Timeout == PXE_BOOT_PROMPT_AUTO_SELECT) {\r
-    return AUTO_SELECT;\r
-  }\r
-  //\r
-  // if no timeout, go directly to display of menu\r
-  //\r
-  if (BootPromptPtr->Timeout == PXE_BOOT_PROMPT_NO_TIMEOUT) {\r
-    return DO_MENU;\r
-  }\r
-  //\r
-  //\r
-  //\r
-  Status = gBS->CreateEvent (\r
-                  EVT_TIMER,\r
-                  TPL_CALLBACK,\r
-                  NULL,\r
-                  NULL,\r
-                  &TimeoutEvent\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return DO_MENU;\r
-  }\r
-\r
-  Status = gBS->SetTimer (\r
-                  TimeoutEvent,\r
-                  TimerRelative,\r
-                  BootPromptPtr->Timeout * 10000000 + 100000\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return DO_MENU;\r
-  }\r
-  //\r
-  //\r
-  //\r
-  Status = gBS->CreateEvent (\r
-                  EVT_TIMER,\r
-                  TPL_CALLBACK,\r
-                  NULL,\r
-                  NULL,\r
-                  &SecondsEvent\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return DO_MENU;\r
-  }\r
-\r
-  Status = gBS->SetTimer (\r
-                  SecondsEvent,\r
-                  TimerPeriodic,\r
-                  10000000\r
-                  );  /* 1 second */\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->CloseEvent (SecondsEvent);\r
-    gBS->CloseEvent (TimeoutEvent);\r
-    return DO_MENU;\r
-  }\r
-  //\r
-  // display the prompt\r
-  // IMPORTANT!  This prompt is an ASCII character string that may\r
-  // not be terminated with a NULL byte.\r
-  //\r
-  SaveChar  = BootPromptPtr->Prompt[BootPromptPtr->Header.Length - 1];\r
-  BootPromptPtr->Prompt[BootPromptPtr->Header.Length - 1] = 0;\r
-\r
-  AsciiPrint ("%a ", BootPromptPtr->Prompt);\r
-  BootPromptPtr->Prompt[BootPromptPtr->Header.Length - 1] = SaveChar;\r
-\r
-  //\r
-  // wait until time expires or selection made - menu or local\r
-  //\r
-  SecColumn = gST->ConOut->Mode->CursorColumn;\r
-  SecRow    = gST->ConOut->Mode->CursorRow;\r
-  SecsLeft  = BootPromptPtr->Timeout;\r
-\r
-  gST->ConOut->SetCursorPosition (gST->ConOut, SecColumn, SecRow);\r
-  AsciiPrint ("(%d) ", SecsLeft);\r
-\r
-  //\r
-  // set the default action to be AUTO_SELECT\r
-  //\r
-  Status = AUTO_SELECT;\r
-\r
-  while (EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {\r
-    EFI_INPUT_KEY Key;\r
-\r
-    if (!EFI_ERROR (gBS->CheckEvent (SecondsEvent))) {\r
-      --SecsLeft;\r
-      gST->ConOut->SetCursorPosition (gST->ConOut, SecColumn, SecRow);\r
-      AsciiPrint ("(%d) ", SecsLeft);\r
-    }\r
-\r
-    if (gST->ConIn->ReadKeyStroke (gST->ConIn, &Key) == EFI_NOT_READY) {\r
-      UINT8       Buffer[512];\r
-      UINTN       BufferSize;\r
-\r
-      BufferSize = sizeof Buffer;\r
-\r
-      Status = Private->EfiBc.UdpRead (\r
-                                &Private->EfiBc,\r
-                                EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP |\r
-                                EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT |\r
-                                EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT,\r
-                                NULL, /* dest ip */\r
-                                NULL, /* dest port */\r
-                                NULL, /* src ip */\r
-                                NULL, /* src port */\r
-                                NULL, /* hdr size */\r
-                                NULL, /* hdr ptr */\r
-                                &BufferSize,\r
-                                Buffer\r
-                                );\r
-\r
-      continue;\r
-    }\r
-\r
-    if (Key.ScanCode == 0) {\r
-      switch (Key.UnicodeChar) {\r
-      case Ctl ('c'):\r
-        Status = LOCAL_BOOT;\r
-        break;\r
-\r
-      case Ctl ('m'):\r
-      case 'm':\r
-      case 'M':\r
-        Status = DO_MENU;\r
-        break;\r
-\r
-      default:\r
-        continue;\r
-      }\r
-    } else {\r
-      switch (Key.ScanCode) {\r
-      case SCAN_F8:\r
-        Status = DO_MENU;\r
-        break;\r
-\r
-      case SCAN_ESC:\r
-        Status = LOCAL_BOOT;\r
-        break;\r
-\r
-      default:\r
-        continue;\r
-      }\r
-    }\r
-\r
-    break;\r
-  }\r
-\r
-  gBS->CloseEvent (SecondsEvent);\r
-  gBS->CloseEvent (TimeoutEvent);\r
-\r
-  gST->ConOut->SetCursorPosition (gST->ConOut, SecColumn, SecRow);\r
-  AsciiPrint ("     ");\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Display one menu item.\r
-\r
-  @param  MenuItemPtr                                 Pointer to PXE menu item\r
-                                                      option.\r
-\r
-  @return None\r
-\r
-**/\r
-VOID\r
-PrintMenuItem (\r
-  PXE_BOOT_MENU_ENTRY *MenuItemPtr\r
-  )\r
-{\r
-  UINT8 Length;\r
-  UINT8 SaveChar;\r
-\r
-  Length                    = (UINT8) MIN (70, MenuItemPtr->DataLen);\r
-  SaveChar                  = MenuItemPtr->Data[Length];\r
-\r
-  MenuItemPtr->Data[Length] = 0;\r
-  AsciiPrint ("     %a\n", MenuItemPtr->Data);\r
-  MenuItemPtr->Data[Length] = SaveChar;\r
-}\r
-\r
-\r
-/**\r
-  Display and process menu.\r
-\r
-  @param  Private                                     Pointer to PxeBc interface\r
-  @param  RxBufferPtr                                 Pointer to receive buffer\r
-\r
-  @retval NO_MENU\r
-  @retval LOCAL_BOOT\r
-\r
-**/\r
-EFI_STATUS\r
-DoMenu (\r
-  PXE_BASECODE_DEVICE *Private,\r
-  DHCP_RECEIVE_BUFFER *RxBufferPtr\r
-  )\r
-{\r
-  PXE_OP_DISCOVERY_CONTROL  *DiscoveryControlPtr;\r
-  PXE_BOOT_MENU_ENTRY       *MenuItemPtrs[MAX_MENULIST];\r
-  EFI_STATUS                Status;\r
-  UNION_PTR                 Ptr;\r
-  UINTN                     SaveNumRte;\r
-  UINTN                     TopRow;\r
-  UINTN                     MenuLth;\r
-  UINTN                     NumMenuItems;\r
-  UINTN                     Index;\r
-  UINTN                     Longest;\r
-  UINTN                     Selected;\r
-  UINT16                    Type;\r
-  UINT16                    Layer;\r
-  BOOLEAN                   Done;\r
-\r
-  Selected  = 0;\r
-  Layer     = 0;\r
-\r
-  DEBUG ((DEBUG_WARN, "\nDoMenu()  Enter."));\r
-\r
-  /* see if we have a menu/prompt */\r
-  if (!(RxBufferPtr->OpAdds.Status & DISCOVER_TYPE)) {\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nDoMenu()  No menu/prompt info.  OpAdds.Status == %xh  ",\r
-      RxBufferPtr->OpAdds.Status)\r
-      );\r
-\r
-    return NO_MENU;\r
-  }\r
-\r
-  DiscoveryControlPtr = (PXE_OP_DISCOVERY_CONTROL *) RxBufferPtr->OpAdds.PxeOptAdds[VEND_PXE_DISCOVERY_CONTROL_IX - 1];\r
-\r
-  //\r
-  // if not USE_BOOTFILE or no bootfile given, must have menu stuff\r
-  //\r
-  if ((DiscoveryControlPtr->ControlBits & USE_BOOTFILE) && RxBufferPtr->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1]) {\r
-    DEBUG ((DEBUG_WARN, "\nDoMenu()  DHCP w/ bootfile.  "));\r
-    return NO_MENU;\r
-  }\r
-  //\r
-  // do prompt & menu if necessary\r
-  //\r
-  Status = DoPrompt (Private, (PXE_OP_BOOT_PROMPT *) RxBufferPtr->OpAdds.PxeOptAdds[VEND_PXE_BOOT_PROMPT_IX - 1]);\r
-\r
-  if (Status == LOCAL_BOOT) {\r
-    DEBUG ((DEBUG_WARN, "\nDoMenu()  DoPrompt() returned LOCAL_BOOT.  "));\r
-\r
-    return Status;\r
-  }\r
-\r
-  Ptr.BytePtr             = (UINT8 *) RxBufferPtr->OpAdds.PxeOptAdds[VEND_PXE_BOOT_MENU_IX - 1];\r
-\r
-  MenuLth                 = Ptr.MenuPtr->Header.Length;\r
-  Ptr.CurrentMenuItemPtr  = Ptr.MenuPtr->MenuItem;\r
-\r
-  //\r
-  // build menu items array\r
-  //\r
-  for (Longest = NumMenuItems = Index = 0; Index < MenuLth && NumMenuItems < MAX_MENULIST;) {\r
-    UINTN lth;\r
-\r
-    lth = Ptr.CurrentMenuItemPtr->DataLen + sizeof (*Ptr.CurrentMenuItemPtr) - sizeof (Ptr.CurrentMenuItemPtr->Data);\r
-\r
-    MenuItemPtrs[NumMenuItems++] = Ptr.CurrentMenuItemPtr;\r
-\r
-    if (lth > Longest) {\r
-      //\r
-      // check if too long\r
-      //\r
-      if ((Longest = lth) > 70 + (sizeof (*Ptr.CurrentMenuItemPtr) - sizeof (Ptr.CurrentMenuItemPtr->Data))) {\r
-        Longest = 70 + (sizeof (*Ptr.CurrentMenuItemPtr) - sizeof (Ptr.CurrentMenuItemPtr->Data));\r
-      }\r
-    }\r
-\r
-    Index += lth;\r
-    Ptr.BytePtr += lth;\r
-  }\r
-\r
-  if (Status != AUTO_SELECT) {\r
-    UINT8 BlankBuf[75];\r
-\r
-    SetMem (BlankBuf, sizeof BlankBuf, ' ');\r
-    BlankBuf[Longest + 5 - (sizeof (*Ptr.CurrentMenuItemPtr) - sizeof (Ptr.CurrentMenuItemPtr->Data))] = 0;\r
-    AsciiPrint ("\n");\r
-\r
-    //\r
-    // now put up menu\r
-    //\r
-    for (Index = 0; Index < NumMenuItems; ++Index) {\r
-      PrintMenuItem (MenuItemPtrs[Index]);\r
-    }\r
-\r
-    TopRow = gST->ConOut->Mode->CursorRow - NumMenuItems;\r
-\r
-    //\r
-    // now wait for a selection\r
-    //\r
-    Done = FALSE;\r
-    do {\r
-      //\r
-      // highlight selection\r
-      //\r
-      EFI_INPUT_KEY Key;\r
-      UINTN         NewSelected;\r
-\r
-      NewSelected = Selected;\r
-\r
-      //\r
-      // highlight selected row\r
-      //\r
-      gST->ConOut->SetAttribute (\r
-                    gST->ConOut,\r
-                    EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY)\r
-                    );\r
-      gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + Selected);\r
-\r
-      AsciiPrint (" --->%a\r", BlankBuf);\r
-\r
-      PrintMenuItem (MenuItemPtrs[Selected]);\r
-      gST->ConOut->SetAttribute (\r
-                    gST->ConOut,\r
-                    EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)\r
-                    );\r
-      gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + NumMenuItems);\r
-\r
-      //\r
-      // wait for a keystroke\r
-      //\r
-      while (gST->ConIn->ReadKeyStroke (gST->ConIn, &Key) == EFI_NOT_READY) {\r
-        UINT8 TmpBuf[512];\r
-        UINTN TmpBufLen;\r
-\r
-        TmpBufLen = sizeof TmpBuf;\r
-\r
-        Private->EfiBc.UdpRead (\r
-                        &Private->EfiBc,\r
-                        EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP |\r
-                        EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT |\r
-                        EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT,\r
-                        NULL, /* dest ip */\r
-                        NULL, /* dest port */\r
-                        NULL, /* src ip */\r
-                        NULL, /* src port */\r
-                        NULL, /* hdr size */\r
-                        NULL, /* hdr ptr */\r
-                        &TmpBufLen,\r
-                        TmpBuf\r
-                        );\r
-      }\r
-\r
-      if (!Key.ScanCode) {\r
-        switch (Key.UnicodeChar) {\r
-        case Ctl ('c'):\r
-          Key.ScanCode = SCAN_ESC;\r
-          break;\r
-\r
-        case Ctl ('j'): /* linefeed */\r
-        case Ctl ('m'): /* return */\r
-          Done = TRUE;\r
-          break;\r
-\r
-        case Ctl ('i'): /* tab */\r
-        case ' ':\r
-        case 'd':\r
-        case 'D':\r
-          Key.ScanCode = SCAN_DOWN;\r
-          break;\r
-\r
-        case Ctl ('h'): /* backspace */\r
-        case 'u':\r
-        case 'U':\r
-          Key.ScanCode = SCAN_UP;\r
-          break;\r
-\r
-        default:\r
-          Key.ScanCode = 0;\r
-        }\r
-      }\r
-\r
-      switch (Key.ScanCode) {\r
-      case SCAN_LEFT:\r
-      case SCAN_UP:\r
-        if (NewSelected) {\r
-          --NewSelected;\r
-        }\r
-\r
-        break;\r
-\r
-      case SCAN_DOWN:\r
-      case SCAN_RIGHT:\r
-        if (++NewSelected == NumMenuItems) {\r
-          --NewSelected;\r
-        }\r
-\r
-        break;\r
-\r
-      case SCAN_PAGE_UP:\r
-      case SCAN_HOME:\r
-        NewSelected = 0;\r
-        break;\r
-\r
-      case SCAN_PAGE_DOWN:\r
-      case SCAN_END:\r
-        NewSelected = NumMenuItems - 1;\r
-        break;\r
-\r
-      case SCAN_ESC:\r
-        return LOCAL_BOOT;\r
-      }\r
-\r
-      /* unhighlight last selected row */\r
-      gST->ConOut->SetCursorPosition (gST->ConOut, 5, TopRow + Selected);\r
-\r
-      AsciiPrint ("%a\r", BlankBuf);\r
-\r
-      PrintMenuItem (MenuItemPtrs[Selected]);\r
-\r
-      Selected = NewSelected;\r
-    } while (!Done);\r
-  }\r
-\r
-  SaveNumRte  = Private->EfiBc.Mode->RouteTableEntries;\r
-\r
-  Type        = NTOHS (MenuItemPtrs[Selected]->Type);\r
-\r
-  if (Type == 0) {\r
-    DEBUG ((DEBUG_WARN, "\nDoMenu()  Local boot selected.  "));\r
-    return LOCAL_BOOT;\r
-  }\r
-\r
-  AsciiPrint ("Discover");\r
-\r
-  Status = Private->EfiBc.Discover (\r
-                            &Private->EfiBc,\r
-                            Type,\r
-                            &Layer,\r
-                            (BOOLEAN) (Private->EfiBc.Mode->BisSupported && Private->EfiBc.Mode->BisDetected),\r
-                            0\r
-                            );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    AsciiPrint ("\r                    \r");\r
-\r
-    DEBUG (\r
-      (DEBUG_WARN,\r
-      "\nDoMenu()  Return w/ %xh (%r).",\r
-      Status,\r
-      Status)\r
-      );\r
-\r
-    return Status;\r
-  }\r
-\r
-  AsciiPrint ("\rBOOT_SERVER_IP: ");\r
-  PrintIpv4 ((UINT8 *) &Private->ServerIp);\r
-\r
-  for (Index = SaveNumRte; Index < Private->EfiBc.Mode->RouteTableEntries; ++Index) {\r
-    if ((Index % 3) == 0) {\r
-      AsciiPrint ("\r\nGATEWAY IP:");\r
-    }\r
-\r
-    AsciiPrint (" ");\r
-    PrintIpv4 ((UINT8 *) &Private->EfiBc.Mode->RouteTable[Index].GwAddr);\r
-    AsciiPrint (" ");\r
-  }\r
-\r
-  AsciiPrint ("\n");\r
-\r
-  DEBUG ((DEBUG_WARN, "\nDoMenu()  Return w/ EFI_SUCCESS.  "));\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Get value 8- or 16-bit value from DHCP option.\r
-\r
-  @param  OpPtr                                       Pointer to DHCP option\r
-\r
-  @return Value from DHCP option\r
-\r
-**/\r
-UINT16\r
-GetValue (\r
-  DHCPV4_OP_STRUCT *OpPtr\r
-  )\r
-{\r
-  if (OpPtr->Header.Length == 1) {\r
-    return OpPtr->Data[0];\r
-  } else {\r
-    return NTOHS (OpPtr->Data);\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Locate opcode in buffer.\r
-\r
-  @param  BufferPtr                                   Pointer to buffer\r
-  @param  BufferLen                                   Length of buffer\r
-  @param  OpCode                                      Option number\r
-\r
-  @return Pointer to opcode, may be NULL\r
-\r
-**/\r
-UINT8 *\r
-_PxeBcFindOpt (\r
-  UINT8 *BufferPtr,\r
-  UINTN BufferLen,\r
-  UINT8 OpCode\r
-  )\r
-{\r
-  if (BufferPtr == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  while (BufferLen != 0) {\r
-    if (*BufferPtr == OpCode) {\r
-      return BufferPtr;\r
-    }\r
-\r
-    switch (*BufferPtr) {\r
-    case OP_END:\r
-      return NULL;\r
-\r
-    case OP_PAD:\r
-      ++BufferPtr;\r
-      --BufferLen;\r
-      continue;\r
-    }\r
-\r
-    if ((UINTN) BufferLen <= (UINTN) 2 + BufferPtr[1]) {\r
-      return NULL;\r
-    }\r
-\r
-    BufferLen -= 2 + BufferPtr[1];\r
-    BufferPtr += 2 + BufferPtr[1];\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-\r
-/**\r
-  Find option in packet\r
-\r
-  @param  PacketPtr                                   Pointer to packet\r
-  @param  OpCode                                      option number\r
-\r
-  @return Pointer to option in packet\r
-\r
-**/\r
-UINT8 *\r
-PxeBcFindDhcpOpt (\r
-  EFI_PXE_BASE_CODE_PACKET  *PacketPtr,\r
-  UINT8                     OpCode\r
-  )\r
-{\r
-  UINTN PacketLen;\r
-  UINT8 Overload;\r
-  UINT8 *OptionBufferPtr;\r
-\r
-  //\r
-  //\r
-  //\r
-  PacketLen = 380;\r
-  Overload  = 0;\r
-\r
-  //\r
-  // Figure size of DHCP option space.\r
-  //\r
-  OptionBufferPtr = _PxeBcFindOpt (\r
-                      PacketPtr->Dhcpv4.DhcpOptions,\r
-                      380,\r
-                      OP_DHCP_MAX_MESSAGE_SZ\r
-                      );\r
-\r
-  if (OptionBufferPtr != NULL) {\r
-    if (OptionBufferPtr[1] == 2) {\r
-      UINT16  n;\r
-\r
-      CopyMem (&n, &OptionBufferPtr[2], 2);\r
-      PacketLen = HTONS (n);\r
-\r
-      if (PacketLen < sizeof (EFI_PXE_BASE_CODE_DHCPV4_PACKET)) {\r
-        PacketLen = 380;\r
-      } else {\r
-        PacketLen -= (PacketPtr->Dhcpv4.DhcpOptions - &PacketPtr->Dhcpv4.BootpOpcode) + 28;\r
-      }\r
-    }\r
-  }\r
-  //\r
-  // Look for option overloading.\r
-  //\r
-  OptionBufferPtr = _PxeBcFindOpt (\r
-                      PacketPtr->Dhcpv4.DhcpOptions,\r
-                      PacketLen,\r
-                      OP_DHCP_OPTION_OVERLOAD\r
-                      );\r
-\r
-  if (OptionBufferPtr != NULL) {\r
-    if (OptionBufferPtr[1] == 1) {\r
-      Overload = OptionBufferPtr[2];\r
-    }\r
-  }\r
-  //\r
-  // Look for caller's option.\r
-  //\r
-  OptionBufferPtr = _PxeBcFindOpt (\r
-                      PacketPtr->Dhcpv4.DhcpOptions,\r
-                      PacketLen,\r
-                      OpCode\r
-                      );\r
-\r
-  if (OptionBufferPtr != NULL) {\r
-    return OptionBufferPtr;\r
-  }\r
-\r
-  if (Overload & OVLD_FILE) {\r
-    OptionBufferPtr = _PxeBcFindOpt (PacketPtr->Dhcpv4.BootpBootFile, 128, OpCode);\r
-\r
-    if (OptionBufferPtr != NULL) {\r
-      return OptionBufferPtr;\r
-    }\r
-  }\r
-\r
-  if (Overload & OVLD_SRVR_NAME) {\r
-    OptionBufferPtr = _PxeBcFindOpt (PacketPtr->Dhcpv4.BootpSrvName, 64, OpCode);\r
-\r
-    if (OptionBufferPtr != NULL) {\r
-      return OptionBufferPtr;\r
-    }\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-\r
-/**\r
-  Download file into buffer\r
-\r
-  @param  Private                                     Pointer to PxeBc interface\r
-  @param  BufferSize                                  pointer to size of download\r
-                                                      buffer\r
-  @param  Buffer                                      Pointer to buffer\r
-\r
-  @return EFI_BUFFER_TOO_SMALL -\r
-  @return EFI_NOT_FOUND -\r
-  @return EFI_PROTOCOL_ERROR -\r
-\r
-**/\r
-EFI_STATUS\r
-DownloadFile (\r
-  IN PXE_BASECODE_DEVICE  *Private,\r
-  IN OUT UINT64           *BufferSize,\r
-  IN VOID                 *Buffer\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MTFTP_INFO  MtftpInfo;\r
-  EFI_PXE_BASE_CODE_TFTP_OPCODE OpCode;\r
-  DHCP_RECEIVE_BUFFER           *RxBuf;\r
-  EFI_STATUS                    Status;\r
-  UINTN                         BlockSize;\r
-\r
-  RxBuf     = (DHCP_RECEIVE_BUFFER *) Private->BootServerReceiveBuffer;\r
-  BlockSize = 0x8000;\r
-\r
-  DEBUG ((EFI_D_WARN, "\nDownloadFile()  Enter."));\r
-\r
-  if (Buffer == NULL || *BufferSize == 0 || *BufferSize < Private->FileSize) {\r
-    if (Private->FileSize != 0) {\r
-      *BufferSize = Private->FileSize;\r
-      return EFI_BUFFER_TOO_SMALL;\r
-    }\r
-\r
-    AsciiPrint ("\nTSize");\r
-\r
-    OpCode = EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE;\r
-  } else if (RxBuf->OpAdds.Status & WfM11a_TYPE) {\r
-    OpCode = EFI_PXE_BASE_CODE_MTFTP_READ_FILE;\r
-\r
-    ZeroMem (&MtftpInfo, sizeof MtftpInfo);\r
-\r
-    *(IPV4_ADDR *) &MtftpInfo.MCastIp = *(IPV4_ADDR *) RxBuf->OpAdds.PxeOptAdds[VEND_PXE_MTFTP_IP - 1]->Data;\r
-\r
-    CopyMem (\r
-      &MtftpInfo.CPort,\r
-      RxBuf->OpAdds.PxeOptAdds[VEND_PXE_MTFTP_CPORT - 1]->Data,\r
-      sizeof MtftpInfo.CPort\r
-      );\r
-\r
-    CopyMem (\r
-      &MtftpInfo.SPort,\r
-      RxBuf->OpAdds.PxeOptAdds[VEND_PXE_MTFTP_SPORT - 1]->Data,\r
-      sizeof MtftpInfo.SPort\r
-      );\r
-\r
-    MtftpInfo.ListenTimeout   = GetValue (RxBuf->OpAdds.PxeOptAdds[VEND_PXE_MTFTP_TMOUT - 1]);\r
-\r
-    MtftpInfo.TransmitTimeout = GetValue (RxBuf->OpAdds.PxeOptAdds[VEND_PXE_MTFTP_DELAY - 1]);\r
-\r
-    AsciiPrint ("\nMTFTP");\r
-  } else {\r
-    AsciiPrint ("\nTFTP");\r
-\r
-    OpCode = EFI_PXE_BASE_CODE_TFTP_READ_FILE;\r
-  }\r
-\r
-  Private->FileSize = 0;\r
-\r
-  RxBuf->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1]->Data[RxBuf->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1]->Header.Length] = 0;\r
-\r
-  Status = Private->EfiBc.Mtftp (\r
-                            &Private->EfiBc,\r
-                            OpCode,\r
-                            Buffer,\r
-                            FALSE,\r
-                            BufferSize,\r
-                            &BlockSize,\r
-                            &Private->ServerIp,\r
-                            (UINT8 *) RxBuf->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1]->Data,\r
-                            &MtftpInfo,\r
-                            FALSE\r
-                            );\r
-\r
-  if (Status != EFI_SUCCESS && Status != EFI_BUFFER_TOO_SMALL) {\r
-    DEBUG ((DEBUG_WARN, "\nDownloadFile()  Exit #1 %Xh", Status));\r
-    return Status;\r
-  }\r
-\r
-  if (sizeof (UINTN) < sizeof (UINT64) && *BufferSize > 0xFFFFFFFF) {\r
-    Private->FileSize = 0xFFFFFFFF;\r
-  } else {\r
-    Private->FileSize = (UINTN) *BufferSize;\r
-  }\r
-\r
-  if (OpCode == EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE) {\r
-    DEBUG ((DEBUG_WARN, "\nDownloadFile()  Exit #2"));\r
-    return EFI_BUFFER_TOO_SMALL;\r
-  }\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((DEBUG_WARN, "\nDownloadFile()  Exit #3 %Xh", Status));\r
-    return Status;\r
-  }\r
-\r
-  if (Private->EfiBc.Mode->BisSupported && Private->EfiBc.Mode->BisDetected && Private->EfiBc.Mode->PxeBisReplyReceived) {\r
-    UINT64  CredentialLen;\r
-    UINT8   CredentialFilename[256];\r
-    UINT8   *op;\r
-    VOID    *CredentialBuffer;\r
-\r
-    //\r
-    // Get name of credential file.  It may be in the BOOTP\r
-    // bootfile field or a DHCP option.\r
-    //\r
-    ZeroMem (CredentialFilename, sizeof CredentialFilename);\r
-\r
-    op = PxeBcFindDhcpOpt (&Private->EfiBc.Mode->PxeBisReply, OP_DHCP_BOOTFILE);\r
-\r
-    if (op != NULL) {\r
-      if (op[1] == 0) {\r
-        /* No credential filename */\r
-        return EFI_NOT_FOUND;\r
-      }\r
-\r
-      CopyMem (CredentialFilename, &op[2], op[1]);\r
-    } else {\r
-      if (Private->EfiBc.Mode->PxeBisReply.Dhcpv4.BootpBootFile[0] == 0) {\r
-        /* No credential filename */\r
-        return EFI_NOT_FOUND;\r
-      }\r
-\r
-      CopyMem (CredentialFilename, &op[2], 128);\r
-    }\r
-    //\r
-    // Get size of credential file.  It may be available as a\r
-    // DHCP option.  If not, use the TFTP get file size.\r
-    //\r
-    CredentialLen = 0;\r
-\r
-    op            = PxeBcFindDhcpOpt (&Private->EfiBc.Mode->PxeBisReply, OP_BOOT_FILE_SZ);\r
-\r
-    if (op != NULL) {\r
-      /*\r
-       * This is actually the size of the credential file\r
-       * buffer.  The actual credential file size will be\r
-       * returned when we download the file.\r
-       */\r
-      if (op[1] == 2) {\r
-        UINT16  n;\r
-\r
-        CopyMem (&n, &op[2], 2);\r
-        CredentialLen = HTONS (n) * 512;\r
-      }\r
-    }\r
-\r
-    if (CredentialLen == 0) {\r
-      BlockSize = 8192;\r
-\r
-      Status = Private->EfiBc.Mtftp (\r
-                                &Private->EfiBc,\r
-                                EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,\r
-                                NULL,\r
-                                FALSE,\r
-                                &CredentialLen,\r
-                                &BlockSize,\r
-                                &Private->ServerIp,\r
-                                CredentialFilename,\r
-                                NULL,\r
-                                FALSE\r
-                                );\r
-\r
-      if (EFI_ERROR (Status)) {\r
-        return Status;\r
-      }\r
-\r
-      if (CredentialLen == 0) {\r
-        //\r
-        // %%TBD -- EFI error for invalid credential\r
-        // file.\r
-        //\r
-        return EFI_PROTOCOL_ERROR;\r
-      }\r
-    }\r
-    //\r
-    // Allocate credential file buffer.\r
-    //\r
-    Status = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    (UINTN) CredentialLen,\r
-                    &CredentialBuffer\r
-                    );\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-    //\r
-    // Download credential file.\r
-    //\r
-    BlockSize = 8192;\r
-\r
-    Status = Private->EfiBc.Mtftp (\r
-                              &Private->EfiBc,\r
-                              EFI_PXE_BASE_CODE_TFTP_READ_FILE,\r
-                              CredentialBuffer,\r
-                              FALSE,\r
-                              &CredentialLen,\r
-                              &BlockSize,\r
-                              &Private->ServerIp,\r
-                              CredentialFilename,\r
-                              NULL,\r
-                              FALSE\r
-                              );\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      gBS->FreePool (CredentialBuffer);\r
-      return Status;\r
-    }\r
-    //\r
-    // Verify credentials.\r
-    //\r
-    if (PxebcBisVerify (Private, Buffer, Private->FileSize, CredentialBuffer, (UINTN) CredentialLen)) {\r
-      Status = EFI_SUCCESS;\r
-    } else {\r
-      //\r
-      // %%TBD -- An EFI error code for failing credential verification.\r
-      //\r
-      Status = EFI_PROTOCOL_ERROR;\r
-    }\r
-\r
-    gBS->FreePool (CredentialBuffer);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Start PXE DHCP.  Get DHCP and proxyDHCP information.\r
-  Display remote boot menu and prompt.  Select item from menu.\r
-\r
-  @param  Private                                     Pointer to PxeBc interface\r
-  @param  BufferSize                                  Pointer to download buffer\r
-                                                      size\r
-  @param  Buffer                                      Pointer to download buffer\r
-\r
-  @retval EFI_SUCCESS\r
-  @retval EFI_NOT_READY\r
-\r
-**/\r
-EFI_STATUS\r
-LoadfileStart (\r
-  IN PXE_BASECODE_DEVICE  *Private,\r
-  IN OUT UINT64           *BufferSize,\r
-  IN VOID                 *Buffer\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_MODE      *PxeBcMode;\r
-  EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
-  EFI_SIMPLE_NETWORK_MODE     *SnpMode;\r
-  EFI_STATUS                  Status;\r
-  VOID                        *RxBuf;\r
-\r
-  DEBUG ((DEBUG_WARN, "\nLoadfileStart()  Enter."));\r
-\r
-  //\r
-  // Try to start BaseCode, for now only IPv4 is supported\r
-  // so don't try to start using IPv6.\r
-  //\r
-  Status = Private->EfiBc.Start (&Private->EfiBc, FALSE);\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    if (Status != EFI_ALREADY_STARTED) {\r
-      DEBUG ((DEBUG_NET, "\nLoadfileStart()  Exit  BC.Start() == %xh", Status));\r
-      return Status;\r
-    }\r
-  }\r
-  //\r
-  // Get pointers to PXE mode structure, SNP protocol structure\r
-  // and SNP mode structure.\r
-  //\r
-  PxeBcMode = Private->EfiBc.Mode;\r
-  Snp       = Private->SimpleNetwork;\r
-  SnpMode   = Snp->Mode;\r
-\r
-  //\r
-  // Display client MAC address, like 16-bit PXE ROMs\r
-  //\r
-  AsciiPrint ("\nCLIENT MAC ADDR: ");\r
-\r
-  {\r
-    UINTN Index;\r
-    UINTN hlen;\r
-\r
-    hlen = SnpMode->HwAddressSize;\r
-\r
-    for (Index = 0; Index < hlen; ++Index) {\r
-      AsciiPrint ("%02x ", SnpMode->CurrentAddress.Addr[Index]);\r
-    }\r
-  }\r
-\r
-  AsciiPrint ("\nDHCP");\r
-\r
-  Status = Private->EfiBc.Dhcp (&Private->EfiBc, TRUE);\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((DEBUG_WARN, "\nLoadfileStart()  Exit  BC.Dhcp() == %Xh", Status));\r
-    AsciiPrint ("\r               \r");\r
-    return Status;\r
-  }\r
-\r
-  ShowMyInfo (Private);\r
-\r
-  RxBuf = PxeBcMode->ProxyOfferReceived ? &PXE_OFFER_BUFFER : &DHCPV4_ACK_BUFFER;\r
-#define RxBufferPtr ((DHCP_RECEIVE_BUFFER *) RxBuf)\r
-\r
-  Status = DoMenu (Private, RxBufferPtr);\r
-\r
-  if (Status == EFI_SUCCESS) {\r
-    //\r
-    // did a discovery - take info from discovery packet\r
-    //\r
-    RxBuf = &PXE_ACK_BUFFER;\r
-  } else if (Status == NO_MENU) {\r
-    //\r
-    // did not do a discovery - take info from rxbuf\r
-    //\r
-    Private->ServerIp.Addr[0] = RxBufferPtr->u.Dhcpv4.siaddr;\r
-\r
-    if (!(Private->ServerIp.Addr[0])) {\r
-      *(IPV4_ADDR *) &Private->ServerIp = *(IPV4_ADDR *) RxBufferPtr->OpAdds.PktOptAdds[OP_DHCP_SERVER_IP_IX - 1]->Data;\r
-    }\r
-  } else {\r
-    DEBUG ((DEBUG_WARN, "\nLoadfileStart()  Exit  DoMenu() == %Xh", Status));\r
-    return Status;\r
-  }\r
-\r
-  if (!RxBufferPtr->OpAdds.PktOptAdds[OP_DHCP_BOOTFILE_IX - 1]) {\r
-    DEBUG ((DEBUG_WARN, "\nLoadfileStart()  Exit  Not ready?"));\r
-    return EFI_NOT_READY;\r
-  }\r
-  //\r
-  // check for file size option sent\r
-  //\r
-  if (RxBufferPtr->OpAdds.PktOptAdds[OP_BOOT_FILE_SZ_IX - 1]) {\r
-    Private->FileSize = 512 * NTOHS (RxBufferPtr->OpAdds.PktOptAdds[OP_BOOT_FILE_SZ_IX - 1]->Data);\r
-  }\r
-\r
-  Private->BootServerReceiveBuffer  = RxBufferPtr;\r
-\r
-  Status = DownloadFile (Private, BufferSize, Buffer);\r
-\r
-  DEBUG (\r
-    (DEBUG_WARN,\r
-    "\nLoadfileStart()  Exit.  DownloadFile() = %Xh",\r
-    Status)\r
-    );\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Loadfile interface for PxeBc interface\r
-\r
-  @param  This                                        Pointer to Loadfile interface\r
-  @param  FilePath                                    Not used and not checked\r
-  @param  BootPolicy                                  Must be TRUE\r
-  @param  BufferSize                                  Pointer to buffer size\r
-  @param  Buffer                                      Pointer to download buffer or\r
-                                                      NULL\r
-\r
-  @return EFI_INVALID_PARAMETER -\r
-  @return EFI_UNSUPPORTED -\r
-  @return EFI_SUCCESS -\r
-  @return EFI_BUFFER_TOO_SMALL -\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-LoadFile (\r
-  IN EFI_LOAD_FILE_PROTOCOL           *This,\r
-  IN EFI_DEVICE_PATH_PROTOCOL         *FilePath,\r
-  IN BOOLEAN                          BootPolicy,\r
-  IN OUT UINTN                        *BufferSize,\r
-  IN OUT VOID                         *Buffer\r
-  )\r
-{\r
-  LOADFILE_DEVICE *LoadfilePtr;\r
-  UINT64          TmpBufSz;\r
-  INT32           OrigMode;\r
-  INT32           OrigAttribute;\r
-  BOOLEAN         RemoveCallback;\r
-  BOOLEAN         NewMakeCallback;\r
-  EFI_STATUS      Status;\r
-  EFI_STATUS      TempStatus;\r
-\r
-  //\r
-  // The following line is only used for passing ICC build.\r
-  //\r
-  DEBUG ((EFI_D_INFO, "FilePath = %p\n", FilePath));\r
-\r
-  //\r
-  //\r
-  //\r
-  OrigMode        = gST->ConOut->Mode->Mode;\r
-  OrigAttribute   = gST->ConOut->Mode->Attribute;\r
-  RemoveCallback  = FALSE;\r
-\r
-  AsciiPrint ("Running LoadFile()\n");\r
-\r
-  //\r
-  // Resolve Warning 4 unreferenced parameter problem\r
-  //\r
-  FilePath = NULL;\r
-\r
-  //\r
-  // If either if these parameters are NULL, we cannot continue.\r
-  //\r
-  if (This == NULL || BufferSize == NULL) {\r
-    DEBUG ((DEBUG_WARN, "\nLoadFile()  This or BufferSize == NULL"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // We only support BootPolicy == TRUE\r
-  //\r
-  if (!BootPolicy) {\r
-    DEBUG ((DEBUG_WARN, "\nLoadFile()  BootPolicy == FALSE"));\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-  //\r
-  // Get pointer to LoadFile protocol structure.\r
-  //\r
-  LoadfilePtr = CR (This, LOADFILE_DEVICE, LoadFile, LOADFILE_DEVICE_SIGNATURE);\r
-\r
-  if (LoadfilePtr == NULL) {\r
-    DEBUG (\r
-      (DEBUG_NET,\r
-      "\nLoadFile()  Could not get pointer to LoadFile structure")\r
-      );\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Lock interface\r
-  //\r
-  EfiAcquireLock (&LoadfilePtr->Lock);\r
-\r
-  //\r
-  // Set console output mode and display attribute\r
-  //\r
-  if (OrigMode != 0) {\r
-    gST->ConOut->SetMode (gST->ConOut, 0);\r
-  }\r
-\r
-  gST->ConOut->SetAttribute (\r
-                gST->ConOut,\r
-                EFI_TEXT_ATTR (EFI_LIGHTGRAY,EFI_BLACK)\r
-                );\r
-\r
-  //\r
-  // See if BaseCode already has a Callback protocol attached.\r
-  // If there is none, attach our own Callback protocol.\r
-  //\r
-  Status = gBS->HandleProtocol (\r
-                  LoadfilePtr->Private->Handle,\r
-                  &gEfiPxeBaseCodeCallbackProtocolGuid,\r
-                  (VOID *) &LoadfilePtr->Private->CallbackProtocolPtr\r
-                  );\r
-\r
-  if (Status == EFI_SUCCESS) {\r
-    //\r
-    // There is already a callback routine.  Do nothing.\r
-    //\r
-    DEBUG ((DEBUG_WARN, "\nLoadFile()  BC callback exists."));\r
-\r
-  } else if (Status == EFI_UNSUPPORTED) {\r
-    //\r
-    // No BaseCode Callback protocol found.  Add our own.\r
-    //\r
-    Status = gBS->InstallProtocolInterface (\r
-                    &LoadfilePtr->Private->Handle,\r
-                    &gEfiPxeBaseCodeCallbackProtocolGuid,\r
-                    EFI_NATIVE_INTERFACE,\r
-                    &_bc_callback\r
-                    );\r
-\r
-    DEBUG ((DEBUG_WARN, "\nLoadFile()  Callback install status == %xh", Status));\r
-\r
-    RemoveCallback = (BOOLEAN) (Status == EFI_SUCCESS);\r
-\r
-    if (LoadfilePtr->Private->EfiBc.Mode != NULL && LoadfilePtr->Private->EfiBc.Mode->Started) {\r
-      NewMakeCallback = TRUE;\r
-      LoadfilePtr->Private->EfiBc.SetParameters (\r
-                                    &LoadfilePtr->Private->EfiBc,\r
-                                    NULL,\r
-                                    NULL,\r
-                                    NULL,\r
-                                    NULL,\r
-                                    &NewMakeCallback\r
-                                    );\r
-    }\r
-\r
-  } else {\r
-    DEBUG ((DEBUG_WARN, "\nLoadFile()  Callback check status == %xh", Status));\r
-  }\r
-  //\r
-  // Check for starting or for continuing after already getting\r
-  // the file size.\r
-  //\r
-  if (LoadfilePtr->Private->FileSize == 0) {\r
-    TmpBufSz  = 0;\r
-    Status    = LoadfileStart (LoadfilePtr->Private, &TmpBufSz, Buffer);\r
-\r
-    if (sizeof (UINTN) < sizeof (UINT64) && TmpBufSz > 0xFFFFFFFF) {\r
-      *BufferSize = 0xFFFFFFFF;\r
-    } else {\r
-      *BufferSize = (UINTN) TmpBufSz;\r
-    }\r
-\r
-    if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      //\r
-      // This is done so loadfile will work even if the boot manager\r
-      // did not make the first call with Buffer == NULL.\r
-      //\r
-      Buffer = NULL;\r
-    }\r
-  } else if (Buffer == NULL) {\r
-    DEBUG ((DEBUG_WARN, "\nLoadfile()  Get buffer size"));\r
-\r
-    //\r
-    // Continuing from previous LoadFile request.  Make sure there\r
-    // is a buffer and that it is big enough.\r
-    //\r
-    *BufferSize = LoadfilePtr->Private->FileSize;\r
-    Status      = EFI_BUFFER_TOO_SMALL;\r
-  } else {\r
-    DEBUG ((DEBUG_WARN, "\nLoadFile()  Download file"));\r
-\r
-    //\r
-    // Everything looks good, try to download the file.\r
-    //\r
-    TmpBufSz  = *BufferSize;\r
-    Status    = DownloadFile (LoadfilePtr->Private, &TmpBufSz, Buffer);\r
-\r
-    //\r
-    // Next call to loadfile will start DHCP process again.\r
-    //\r
-    LoadfilePtr->Private->FileSize = 0;\r
-  }\r
-  //\r
-  // If we added a callback protocol, now is the time to remove it.\r
-  //\r
-  if (RemoveCallback) {\r
-    NewMakeCallback = FALSE;\r
-    TempStatus = LoadfilePtr->Private->EfiBc.SetParameters (\r
-                                          &LoadfilePtr->Private->EfiBc,\r
-                                          NULL,\r
-                                          NULL,\r
-                                          NULL,\r
-                                          NULL,\r
-                                          &NewMakeCallback\r
-                                          );\r
-\r
-    if (TempStatus == EFI_SUCCESS) {\r
-      gBS->UninstallProtocolInterface (\r
-            LoadfilePtr->Private->Handle,\r
-            &gEfiPxeBaseCodeCallbackProtocolGuid,\r
-            &_bc_callback\r
-            );\r
-    }\r
-  }\r
-  //\r
-  // Restore display mode and attribute\r
-  //\r
-  if (OrigMode != 0) {\r
-    gST->ConOut->SetMode (gST->ConOut, OrigMode);\r
-  }\r
-\r
-  gST->ConOut->SetAttribute (gST->ConOut, OrigAttribute);\r
-\r
-  //\r
-  // Unlock interface\r
-  //\r
-  EfiReleaseLock (&LoadfilePtr->Lock);\r
-\r
-  DEBUG ((DEBUG_WARN, "\nBC.Loadfile()  Status == %xh\n", Status));\r
-\r
-  if (Status == EFI_SUCCESS) {\r
-    return EFI_SUCCESS;\r
-\r
-  } else if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    //\r
-    // Error is only displayed when we are actually trying to\r
-    // download the boot image.\r
-    //\r
-    if (Buffer == NULL) {\r
-      return EFI_BUFFER_TOO_SMALL;\r
-    }\r
-\r
-    AsciiPrint ("\nPXE-E05: Download buffer is smaller than requested file.\n");\r
-\r
-  } else if (Status == EFI_DEVICE_ERROR) {\r
-    AsciiPrint ("\nPXE-E07: Network device error.  Check network connection.\n");\r
-\r
-  } else if (Status == EFI_OUT_OF_RESOURCES) {\r
-    AsciiPrint ("\nPXE-E09: Could not allocate I/O buffers.\n");\r
-\r
-  } else if (Status == EFI_NO_MEDIA) {\r
-    AsciiPrint ("\nPXE-E12: Could not detect network connection.  Check cable.\n");\r
-\r
-  } else if (Status == EFI_NO_RESPONSE) {\r
-    AsciiPrint ("\nPXE-E16: Valid PXE offer not received.\n");\r
-\r
-  } else if (Status == EFI_TIMEOUT) {\r
-    AsciiPrint ("\nPXE-E18: Timeout.  Server did not respond.\n");\r
-\r
-  } else if (Status == EFI_ABORTED) {\r
-    AsciiPrint ("\nPXE-E21: Remote boot cancelled.\n");\r
-\r
-  } else if (Status == EFI_ICMP_ERROR) {\r
-    AsciiPrint ("\nPXE-E22: Client received ICMP error from server.\n");\r
-\r
-    if (LoadfilePtr->Private->EfiBc.Mode != NULL) {\r
-      if (LoadfilePtr->Private->EfiBc.Mode->IcmpErrorReceived) {\r
-\r
-      AsciiPrint (\r
-          "PXE-E98: Type: %xh  Code: %xh  ",\r
-          LoadfilePtr->Private->EfiBc.Mode->IcmpError.Type,\r
-          LoadfilePtr->Private->EfiBc.Mode->IcmpError.Code\r
-          );\r
-\r
-        switch (LoadfilePtr->Private->EfiBc.Mode->IcmpError.Type) {\r
-        case 0x03:\r
-          switch (LoadfilePtr->Private->EfiBc.Mode->IcmpError.Code) {\r
-          case 0x00:              /* net unreachable */\r
-          AsciiPrint ("Net unreachable");\r
-            break;\r
-\r
-          case 0x01:              /* host unreachable */\r
-          AsciiPrint ("Host unreachable");\r
-            break;\r
-\r
-          case 0x02:              /* protocol unreachable */\r
-          AsciiPrint ("Protocol unreachable");\r
-            break;\r
-\r
-          case 0x03:              /* port unreachable */\r
-          AsciiPrint ("Port unreachable");\r
-            break;\r
-\r
-          case 0x04:              /* Fragmentation needed */\r
-          AsciiPrint ("Fragmentation needed");\r
-            break;\r
-\r
-          case 0x05:              /* Source route failed */\r
-          AsciiPrint ("Source route failed");\r
-            break;\r
-          }\r
-\r
-          break;\r
-        }\r
-\r
-      AsciiPrint ("\n");\r
-      }\r
-    }\r
-\r
-  } else if (Status == EFI_TFTP_ERROR) {\r
-    AsciiPrint ("\nPXE-E23: Client received TFTP error from server.\n");\r
-\r
-    if (LoadfilePtr->Private->EfiBc.Mode != NULL) {\r
-      if (LoadfilePtr->Private->EfiBc.Mode->TftpErrorReceived) {\r
-      AsciiPrint (\r
-          "PXE-E98: Code: %xh  %a\n",\r
-          LoadfilePtr->Private->EfiBc.Mode->TftpError.ErrorCode,\r
-          LoadfilePtr->Private->EfiBc.Mode->TftpError.ErrorString\r
-          );\r
-      }\r
-    }\r
-\r
-  } else {\r
-    AsciiPrint ("\nPXE-E99: Unexpected network error: %xh\n", Status);\r
-  }\r
-\r
-  LoadfilePtr->Private->EfiBc.Stop (&LoadfilePtr->Private->EfiBc);\r
-\r
-  return Status;\r
-}\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/Tftp.h b/MdeModulePkg/Universal/Network/PxeBcDxe/Tftp.h
deleted file mode 100644 (file)
index 018af5a..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  tftp.h\r
-\r
-Abstract:\r
-\r
-\r
-**/\r
-\r
-#ifndef __TFTP_H__\r
-#define __TFTP_H__\r
-\r
-//\r
-// Definitions for trivial file transfer protocol functionality with IP v4\r
-// Per RFC 1350, July 1992 and RFC 2347, 8, and 9, May 1998\r
-//\r
-#pragma pack(1)\r
-//\r
-// max and min packet sizes\r
-// (all data packets in transmission except last)\r
-//\r
-#define MAX_TFTP_PKT_SIZE (BUFFER_ALLOCATE_SIZE - 512)\r
-#define MIN_TFTP_PKT_SIZE 512\r
-\r
-//\r
-// TFTPv4 OpCodes\r
-//\r
-#define TFTP_RRQ    1 // read request\r
-#define TFTP_WRQ    2 // write request\r
-#define TFTP_DATA   3 // data\r
-#define TFTP_ACK    4 // acknowledgement\r
-#define TFTP_ERROR  5 // error packet\r
-#define TFTP_OACK   6 // option acknowledge\r
-#define TFTP_DIR    7 // read directory request\r
-#define TFTP_DATA8  8\r
-#define TFTP_ACK8   9\r
-\r
-//\r
-// request packet (read or write)\r
-// Fields shown (except file name) are not to be referenced directly,\r
-// since their placement is variable within a request packet.\r
-// All are null terminated case insensitive ascii strings.\r
-//\r
-struct Tftpv4Req {\r
-  UINT16  OpCode;       // TFTP Op code\r
-  UINT8   FileName[2];  // file name\r
-  UINT8   Mode[2];      // "netascii" or "octet"\r
-  struct {              // optionally, one or more option requests\r
-    UINT8 Option[2];    // option name\r
-    UINT8 Value[2];     // value requested\r
-  } OpReq[1];\r
-};\r
-\r
-//\r
-// modes\r
-//\r
-#define MODE_ASCII  "netascii"\r
-#define MODE_BINARY "octet"\r
-\r
-//\r
-// option strings\r
-//\r
-#define OP_BLKSIZE    "blksize"   // block size option\r
-#define OP_TIMEOUT    "timeout"   // time to wait before retransmitting\r
-#define OP_TFRSIZE    "tsize"     // total transfer size option\r
-#define OP_OVERWRITE  "overwrite" // overwrite file option\r
-#define OP_BIGBLKNUM  "bigblk#"   // big block number\r
-// See RFC 2347, 8, and 9 for more information on TFTP options\r
-// option acknowledge packet (optional)\r
-// options not acknowledged are rejected\r
-//\r
-struct Tftpv4Oack {\r
-  UINT16  OpCode;     // TFTP Op code\r
-  struct {            // optionally, one or more option acknowledgements\r
-    UINT8 Option[2];  // option name (of those requested)\r
-    UINT8 Value[2];   // value acknowledged\r
-  } OpAck[1];\r
-};\r
-\r
-//\r
-// acknowledge packet\r
-//\r
-struct Tftpv4Ack {\r
-  UINT16  OpCode; // TFTP Op code\r
-  UINT16  BlockNum;\r
-};\r
-\r
-//\r
-// data packet\r
-//\r
-struct Tftpv4Data {\r
-  struct Tftpv4Ack  Header;\r
-  UINT8             Data[512];\r
-};\r
-\r
-//\r
-// big block number ack packet\r
-//\r
-struct Tftpv4Ack8 {\r
-  UINT16  OpCode;\r
-  UINT64  BlockNum;\r
-};\r
-\r
-//\r
-// big block number data packet\r
-//\r
-struct Tftpv4Data8 {\r
-  struct Tftpv4Ack8 Header;\r
-  UINT8             Data[506];\r
-};\r
-\r
-//\r
-// error packet\r
-//\r
-struct Tftpv4Error {\r
-  UINT16  OpCode;     // TFTP Op code\r
-  UINT16  ErrCode;    // error code\r
-  UINT8   ErrMsg[1];  // error message (nul terminated)\r
-};\r
-\r
-#pragma pack()\r
-//\r
-// error codes\r
-//\r
-#define TFTP_ERR_UNDEF      0 //     Not defined, see error message (if any).\r
-#define TFTP_ERR_NOT_FOUND  1 //     File not found.\r
-#define TFTP_ERR_ACCESS     2 //     Access violation.\r
-#define TFTP_ERR_FULL       3 //     Disk full or allocation exceeded.\r
-#define TFTP_ERR_ILLEGAL    4 //     Illegal TFTP operation.\r
-#define TFTP_ERR_BAD_ID     5 //     Unknown transfer ID.\r
-#define TFTP_ERR_EXISTS     6 //     File already exists.\r
-#define TFTP_ERR_NO_USER    7 //     No such user.\r
-#define TFTP_ERR_OPTION     8 //     Option negotiation termination\r
-//\r
-// some defines\r
-//\r
-#define REQ_RESP_TIMEOUT        5 // Wait five seconds for request response.\r
-#define ACK_TIMEOUT             4 // Wait four seconds for ack response.\r
-#define NUM_ACK_RETRIES         3\r
-#define NUM_MTFTP_OPEN_RETRIES  3\r
-\r
-#endif /* __TFTP_H__ */\r
-\r
-/* EOF - tftp.h */\r
diff --git a/MdeModulePkg/Universal/Network/PxeBcDxe/X64/PxeArch.h b/MdeModulePkg/Universal/Network/PxeBcDxe/X64/PxeArch.h
deleted file mode 100644 (file)
index 33a7b26..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeArch.h\r
-\r
-Abstract:\r
-  Defines PXE Arch type\r
-\r
-\r
-**/\r
-\r
-#ifndef _EFI_PXE_ARCH_H_\r
-#define _EFI_PXE_ARCH_H_\r
-\r
-#define SYS_ARCH  0x7\r
-\r
-#endif\r
diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/ComponentName.c
deleted file mode 100644 (file)
index 1897347..0000000
+++ /dev/null
@@ -1,324 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  ComponentName.c\r
-\r
-Abstract:\r
-  PxeDhcp4 component name protocol declarations\r
-\r
-\r
-**/\r
-\r
-#include "PxeDhcp4.h"\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// EFI Component Name Functions\r
-//\r
-/**\r
-  Retrieves a Unicode string that is the user readable name of the driver.\r
-\r
-  This function retrieves the user readable name of a driver in the form of a\r
-  Unicode string. If the driver specified by This has a user readable name in\r
-  the language specified by Language, then a pointer to the driver name is\r
-  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified\r
-  by This does not support the language specified by Language,\r
-  then EFI_UNSUPPORTED is returned.\r
-\r
-  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
-                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
-\r
-  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
-                                array indicating the language. This is the\r
-                                language of the driver name that the caller is\r
-                                requesting, and it must match one of the\r
-                                languages specified in SupportedLanguages. The\r
-                                number of languages supported by a driver is up\r
-                                to the driver writer. Language is specified\r
-                                in RFC 3066 or ISO 639-2 language code format.\r
-\r
-  @param  DriverName[out]       A pointer to the Unicode string to return.\r
-                                This Unicode string is the name of the\r
-                                driver specified by This in the language\r
-                                specified by Language.\r
-\r
-  @retval EFI_SUCCESS           The Unicode string for the Driver specified by\r
-                                This and the language specified by Language was\r
-                                returned in DriverName.\r
-\r
-  @retval EFI_INVALID_PARAMETER Language is NULL.\r
-\r
-  @retval EFI_INVALID_PARAMETER DriverName is NULL.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
-                                the language specified by Language.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4ComponentNameGetDriverName (\r
-  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,\r
-  IN  CHAR8                        *Language,\r
-  OUT CHAR16                       **DriverName\r
-  );\r
-\r
-\r
-/**\r
-  Retrieves a Unicode string that is the user readable name of the controller\r
-  that is being managed by a driver.\r
-\r
-  This function retrieves the user readable name of the controller specified by\r
-  ControllerHandle and ChildHandle in the form of a Unicode string. If the\r
-  driver specified by This has a user readable name in the language specified by\r
-  Language, then a pointer to the controller name is returned in ControllerName,\r
-  and EFI_SUCCESS is returned.  If the driver specified by This is not currently\r
-  managing the controller specified by ControllerHandle and ChildHandle,\r
-  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not\r
-  support the language specified by Language, then EFI_UNSUPPORTED is returned.\r
-\r
-  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
-                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
-\r
-  @param  ControllerHandle[in]  The handle of a controller that the driver\r
-                                specified by This is managing.  This handle\r
-                                specifies the controller whose name is to be\r
-                                returned.\r
-\r
-  @param  ChildHandle[in]       The handle of the child controller to retrieve\r
-                                the name of.  This is an optional parameter that\r
-                                may be NULL.  It will be NULL for device\r
-                                drivers.  It will also be NULL for a bus drivers\r
-                                that wish to retrieve the name of the bus\r
-                                controller.  It will not be NULL for a bus\r
-                                driver that wishes to retrieve the name of a\r
-                                child controller.\r
-\r
-  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
-                                array indicating the language.  This is the\r
-                                language of the driver name that the caller is\r
-                                requesting, and it must match one of the\r
-                                languages specified in SupportedLanguages. The\r
-                                number of languages supported by a driver is up\r
-                                to the driver writer. Language is specified in\r
-                                RFC 3066 or ISO 639-2 language code format.\r
-\r
-  @param  ControllerName[out]   A pointer to the Unicode string to return.\r
-                                This Unicode string is the name of the\r
-                                controller specified by ControllerHandle and\r
-                                ChildHandle in the language specified by\r
-                                Language from the point of view of the driver\r
-                                specified by This.\r
-\r
-  @retval EFI_SUCCESS           The Unicode string for the user readable name in\r
-                                the language specified by Language for the\r
-                                driver specified by This was returned in\r
-                                DriverName.\r
-\r
-  @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
-\r
-  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
-                                EFI_HANDLE.\r
-\r
-  @retval EFI_INVALID_PARAMETER Language is NULL.\r
-\r
-  @retval EFI_INVALID_PARAMETER ControllerName is NULL.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This is not currently\r
-                                managing the controller specified by\r
-                                ControllerHandle and ChildHandle.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
-                                the language specified by Language.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4ComponentNameGetControllerName (\r
-  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,\r
-  IN  EFI_HANDLE                                      ControllerHandle,\r
-  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,\r
-  IN  CHAR8                                           *Language,\r
-  OUT CHAR16                                          **ControllerName\r
-  );\r
-\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// EFI Component Name Protocol\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL  gPxeDhcp4ComponentName = {\r
-  PxeDhcp4ComponentNameGetDriverName,\r
-  PxeDhcp4ComponentNameGetControllerName,\r
-  "eng"\r
-};\r
-\r
-//\r
-// EFI Component Name 2 Protocol\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPxeDhcp4ComponentName2 = {\r
-  (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) PxeDhcp4ComponentNameGetDriverName,\r
-  (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) PxeDhcp4ComponentNameGetControllerName,\r
-  "en"\r
-};\r
-\r
-\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPxeDhcp4DriverNameTable[] = {\r
-  {\r
-    "eng;en",\r
-    L"PXE DHCPv4 Driver"\r
-  },\r
-  {\r
-    NULL,\r
-    NULL\r
-  }\r
-};\r
-\r
-/**\r
-  Retrieves a Unicode string that is the user readable name of the driver.\r
-\r
-  This function retrieves the user readable name of a driver in the form of a\r
-  Unicode string. If the driver specified by This has a user readable name in\r
-  the language specified by Language, then a pointer to the driver name is\r
-  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified\r
-  by This does not support the language specified by Language,\r
-  then EFI_UNSUPPORTED is returned.\r
-\r
-  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
-                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
-\r
-  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
-                                array indicating the language. This is the\r
-                                language of the driver name that the caller is\r
-                                requesting, and it must match one of the\r
-                                languages specified in SupportedLanguages. The\r
-                                number of languages supported by a driver is up\r
-                                to the driver writer. Language is specified\r
-                                in RFC 3066 or ISO 639-2 language code format.\r
-\r
-  @param  DriverName[out]       A pointer to the Unicode string to return.\r
-                                This Unicode string is the name of the\r
-                                driver specified by This in the language\r
-                                specified by Language.\r
-\r
-  @retval EFI_SUCCESS           The Unicode string for the Driver specified by\r
-                                This and the language specified by Language was\r
-                                returned in DriverName.\r
-\r
-  @retval EFI_INVALID_PARAMETER Language is NULL.\r
-\r
-  @retval EFI_INVALID_PARAMETER DriverName is NULL.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
-                                the language specified by Language.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4ComponentNameGetDriverName (\r
-  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,\r
-  IN  CHAR8                        *Language,\r
-  OUT CHAR16                       **DriverName\r
-  )\r
-{\r
-  return LookupUnicodeString2 (\r
-           Language,\r
-           This->SupportedLanguages,\r
-           mPxeDhcp4DriverNameTable,\r
-           DriverName,\r
-           (BOOLEAN)(This == &gPxeDhcp4ComponentName)\r
-           );\r
-}\r
-\r
-/**\r
-  Retrieves a Unicode string that is the user readable name of the controller\r
-  that is being managed by a driver.\r
-\r
-  This function retrieves the user readable name of the controller specified by\r
-  ControllerHandle and ChildHandle in the form of a Unicode string. If the\r
-  driver specified by This has a user readable name in the language specified by\r
-  Language, then a pointer to the controller name is returned in ControllerName,\r
-  and EFI_SUCCESS is returned.  If the driver specified by This is not currently\r
-  managing the controller specified by ControllerHandle and ChildHandle,\r
-  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not\r
-  support the language specified by Language, then EFI_UNSUPPORTED is returned.\r
-\r
-  @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
-                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
-\r
-  @param  ControllerHandle[in]  The handle of a controller that the driver\r
-                                specified by This is managing.  This handle\r
-                                specifies the controller whose name is to be\r
-                                returned.\r
-\r
-  @param  ChildHandle[in]       The handle of the child controller to retrieve\r
-                                the name of.  This is an optional parameter that\r
-                                may be NULL.  It will be NULL for device\r
-                                drivers.  It will also be NULL for a bus drivers\r
-                                that wish to retrieve the name of the bus\r
-                                controller.  It will not be NULL for a bus\r
-                                driver that wishes to retrieve the name of a\r
-                                child controller.\r
-\r
-  @param  Language[in]          A pointer to a Null-terminated ASCII string\r
-                                array indicating the language.  This is the\r
-                                language of the driver name that the caller is\r
-                                requesting, and it must match one of the\r
-                                languages specified in SupportedLanguages. The\r
-                                number of languages supported by a driver is up\r
-                                to the driver writer. Language is specified in\r
-                                RFC 3066 or ISO 639-2 language code format.\r
-\r
-  @param  ControllerName[out]   A pointer to the Unicode string to return.\r
-                                This Unicode string is the name of the\r
-                                controller specified by ControllerHandle and\r
-                                ChildHandle in the language specified by\r
-                                Language from the point of view of the driver\r
-                                specified by This.\r
-\r
-  @retval EFI_SUCCESS           The Unicode string for the user readable name in\r
-                                the language specified by Language for the\r
-                                driver specified by This was returned in\r
-                                DriverName.\r
-\r
-  @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
-\r
-  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
-                                EFI_HANDLE.\r
-\r
-  @retval EFI_INVALID_PARAMETER Language is NULL.\r
-\r
-  @retval EFI_INVALID_PARAMETER ControllerName is NULL.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This is not currently\r
-                                managing the controller specified by\r
-                                ControllerHandle and ChildHandle.\r
-\r
-  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
-                                the language specified by Language.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4ComponentNameGetControllerName (\r
-  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,\r
-  IN  EFI_HANDLE                                      ControllerHandle,\r
-  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,\r
-  IN  CHAR8                                           *Language,\r
-  OUT CHAR16                                          **ControllerName\r
-  )\r
-{\r
-  return EFI_UNSUPPORTED;\r
-}\r
-\r
-/* EOF - ComponentName.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.c b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.c
deleted file mode 100644 (file)
index 05a0738..0000000
+++ /dev/null
@@ -1,354 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2005, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeDhcp4.c\r
-\r
-Abstract:\r
-\r
-\r
-**/\r
-\r
-\r
-#include "PxeDhcp4.h"\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// Prototypes\r
-// Driver model protocol interface\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4DriverEntryPoint (\r
-  IN EFI_HANDLE           ImageHandle,\r
-  IN EFI_SYSTEM_TABLE     *SystemTable\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4DriverBindingSupported (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     ControllerHandle,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4DriverBindingStart (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     ControllerHandle,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4DriverBindingStop (\r
-  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN  EFI_HANDLE                     ControllerHandle,\r
-  IN  UINTN                          NumberOfChildren,\r
-  IN  EFI_HANDLE                     *ChildHandleBuffer\r
-  );\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// PXE DHCP Protocol Interface\r
-//\r
-EFI_DRIVER_BINDING_PROTOCOL gPxeDhcp4DriverBinding = {\r
-  PxeDhcp4DriverBindingSupported,\r
-  PxeDhcp4DriverBindingStart,\r
-  PxeDhcp4DriverBindingStop,\r
-  0xa,\r
-  NULL,\r
-  NULL\r
-};\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// PxeDhcp4 Driver Entry point funtion\r
-//\r
-\r
-/**\r
-  Register Driver Binding protocol for this driver.\r
-\r
-  @param  entry                EFI_IMAGE_ENTRY_POINT)\r
-\r
-  @retval EFI_SUCCESS          Driver loaded.\r
-  @retval other                Driver not loaded.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4DriverEntryPoint (\r
-  IN EFI_HANDLE        ImageHandle,\r
-  IN EFI_SYSTEM_TABLE  *SystemTable\r
-  )\r
-{\r
-  return EfiLibInstallDriverBindingComponentName2 (\r
-           ImageHandle,\r
-           SystemTable,\r
-           &gPxeDhcp4DriverBinding,\r
-           NULL,\r
-           &gPxeDhcp4ComponentName,\r
-           &gPxeDhcp4ComponentName2\r
-           );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-  Test to see if this driver supports ControllerHandle.  Any\r
-  ControllerHandle that contains a PxeBaseCode protocol can be\r
-  supported.\r
-\r
-  @param  This                 Protocol instance pointer.\r
-  @param  ControllerHandle     Handle of device to test.\r
-  @param  RemainingDevicePath  Not used.\r
-\r
-  @retval EFI_SUCCESS          This driver supports this device.\r
-  @retval EFI_ALREADY_STARTED  This driver is already running on this device.\r
-  @retval other                This driver does not support this device.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4DriverBindingSupported (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL  * This,\r
-  IN EFI_HANDLE                   ControllerHandle,\r
-  IN EFI_DEVICE_PATH_PROTOCOL     * RemainingDevicePath OPTIONAL\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
-\r
-  //\r
-  // Open the IO Abstraction(s) needed to perform the supported test.\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  ControllerHandle,\r
-                  &gEfiPxeBaseCodeProtocolGuid,\r
-                  (VOID **) &PxeBc,\r
-                  This->DriverBindingHandle,\r
-                  ControllerHandle,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  //\r
-  // Close the I/O Abstraction(s) used to perform the supported test.\r
-  //\r
-  return gBS->CloseProtocol (\r
-                ControllerHandle,\r
-                &gEfiPxeBaseCodeProtocolGuid,\r
-                This->DriverBindingHandle,\r
-                ControllerHandle\r
-                );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-  Start this driver on ControllerHandle by opening a PxeBaseCode\r
-  protocol and installing a PxeDhcp4 protocol on ControllerHandle.\r
-\r
-  @param  This                 Protocol instance pointer.\r
-  @param  ControllerHandle     Handle of device to bind driver to.\r
-  @param  RemainingDevicePath  Not used, always produce all possible children.\r
-\r
-  @retval EFI_SUCCESS          This driver is added to ControllerHandle.\r
-  @retval EFI_ALREADY_STARTED  This driver is already running on ControllerHandle.\r
-  @retval other                This driver does not support this device.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4DriverBindingStart (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL  * This,\r
-  IN EFI_HANDLE                   ControllerHandle,\r
-  IN EFI_DEVICE_PATH_PROTOCOL     * RemainingDevicePath OPTIONAL\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
-  EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
-  PXE_DHCP4_PRIVATE_DATA      *Private;\r
-\r
-  //\r
-  // Connect to the PxeBaseCode interface on ControllerHandle.\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  ControllerHandle,\r
-                  &gEfiPxeBaseCodeProtocolGuid,\r
-                  (VOID **) &PxeBc,\r
-                  This->DriverBindingHandle,\r
-                  ControllerHandle,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  //\r
-  // BaseCode has already grabbed the SimpleNetwork interface\r
-  // so just do a HandleProtocol() to get it.\r
-  //\r
-  Status = gBS->HandleProtocol (\r
-                  ControllerHandle,\r
-                  &gEfiSimpleNetworkProtocolGuid,\r
-                  (VOID **) &Snp\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    goto error_exit;\r
-  }\r
-\r
-  ASSERT (Snp);\r
-\r
-  //\r
-  // Initialize the PXE DHCP device instance.\r
-  //\r
-  Private = AllocateZeroPool (sizeof (PXE_DHCP4_PRIVATE_DATA));\r
-  if (Private == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto error_exit;\r
-  }\r
-\r
-  Private->Signature          = PXE_DHCP4_PRIVATE_DATA_SIGNATURE;\r
-  Private->PxeBc              = PxeBc;\r
-  Private->Snp                = Snp;\r
-  Private->Handle             = ControllerHandle;\r
-  Private->PxeDhcp4.Revision  = EFI_PXE_DHCP4_PROTOCOL_REVISION;\r
-  Private->PxeDhcp4.Run       = PxeDhcp4Run;\r
-  Private->PxeDhcp4.Setup     = PxeDhcp4Setup;\r
-  Private->PxeDhcp4.Init      = PxeDhcp4Init;\r
-  Private->PxeDhcp4.Select    = PxeDhcp4Select;\r
-  Private->PxeDhcp4.Renew     = PxeDhcp4Renew;\r
-  Private->PxeDhcp4.Rebind    = PxeDhcp4Rebind;\r
-  Private->PxeDhcp4.Release   = PxeDhcp4Release;\r
-  Private->PxeDhcp4.Data      = NULL;\r
-\r
-  //\r
-  // Install protocol interfaces for the PXE DHCP device.\r
-  //\r
-  Status = gBS->InstallProtocolInterface (\r
-                  &ControllerHandle,\r
-                  &gEfiPxeDhcp4ProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &Private->PxeDhcp4\r
-                  );\r
-\r
-  if (!EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-error_exit: ;\r
-  gBS->CloseProtocol (\r
-        ControllerHandle,\r
-        &gEfiPxeBaseCodeProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        ControllerHandle\r
-        );\r
-\r
-  return Status;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-  Stop this driver on ControllerHandle by removing PXE DHCP\r
-  protocol and closing the PXE Base Code protocol on\r
-  ControllerHandle.\r
-\r
-  @param  This                 Protocol instance pointer.\r
-  @param  ControllerHandle     Handle of device to stop driver on.\r
-  @param  NumberOfChildren     Not used.\r
-  @param  ChildHandleBuffer    Not used.\r
-\r
-  @retval EFI_SUCCESS          This driver is removed ControllerHandle.\r
-  @retval other                This driver was not removed from this device.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4DriverBindingStop (\r
-  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN  EFI_HANDLE                     ControllerHandle,\r
-  IN  UINTN                          NumberOfChildren,\r
-  IN  EFI_HANDLE                     *ChildHandleBuffer\r
-  )\r
-{\r
-  EFI_STATUS              Status;\r
-  EFI_PXE_DHCP4_PROTOCOL  *PxeDhcp4;\r
-  PXE_DHCP4_PRIVATE_DATA  *Private;\r
-\r
-  //\r
-  // Get our context back.\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  ControllerHandle,\r
-                  &gEfiPxeDhcp4ProtocolGuid,\r
-                  (VOID **) &PxeDhcp4,\r
-                  This->DriverBindingHandle,\r
-                  ControllerHandle,\r
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (PxeDhcp4);\r
-\r
-  //\r
-  // Release allocated resources\r
-  //\r
-  if (Private->PxeDhcp4.Data) {\r
-    FreePool (Private->PxeDhcp4.Data);\r
-    Private->PxeDhcp4.Data = NULL;\r
-  }\r
-  //\r
-  // Uninstall our protocol\r
-  //\r
-  Status = gBS->UninstallProtocolInterface (\r
-                  ControllerHandle,\r
-                  &gEfiPxeDhcp4ProtocolGuid,\r
-                  &Private->PxeDhcp4\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  //\r
-  // Close any consumed protocols\r
-  //\r
-  Status = gBS->CloseProtocol (\r
-                  ControllerHandle,\r
-                  &gEfiPxeBaseCodeProtocolGuid,\r
-                  This->DriverBindingHandle,\r
-                  ControllerHandle\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  //\r
-  // Release our private data\r
-  //\r
-  FreePool (Private);\r
-\r
-  return Status;\r
-}\r
-\r
-/* EOF - PxeDhcp4.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.h b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4.h
deleted file mode 100644 (file)
index f7db124..0000000
+++ /dev/null
@@ -1,326 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeDhcp4.h\r
-\r
-Abstract:\r
-  Common header for PxeDhcp4 protocol driver\r
-\r
-\r
-**/\r
-#ifndef _PXEDHCP4_H\r
-#define _PXEDHCP4_H\r
-\r
-\r
-#include <Uefi.h>\r
-\r
-#include <Protocol/PxeBaseCode.h>\r
-#include <Protocol/SimpleNetwork.h>\r
-#include <Protocol/PxeDhcp4.h>\r
-#include <Protocol/PxeDhcp4CallBack.h>\r
-\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/UefiDriverEntryPoint.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/UefiLib.h>\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// PxeDhcp4 protocol instance data\r
-//\r
-typedef struct {\r
-  //\r
-  // Signature field used to locate beginning of containment record.\r
-  //\r
-  UINTN Signature;\r
-\r
-#define PXE_DHCP4_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('p', 'x', 'D', '4')\r
-  //\r
-  // Device handle the protocol is bound to.\r
-  //\r
-  EFI_HANDLE                      Handle;\r
-\r
-  //\r
-  // Public PxeDhcp4 protocol interface.\r
-  //\r
-  EFI_PXE_DHCP4_PROTOCOL          PxeDhcp4;\r
-\r
-  //\r
-  // Consumed PxeBc, Snp and PxeDhcp4Callback protocol interfaces.\r
-  //\r
-  EFI_PXE_BASE_CODE_PROTOCOL      *PxeBc;\r
-  EFI_SIMPLE_NETWORK_PROTOCOL     *Snp;\r
-  EFI_PXE_DHCP4_CALLBACK_PROTOCOL *callback;\r
-\r
-  //\r
-  // PxeDhcp4 called function for PxeDhcp4Callback.\r
-  //\r
-  EFI_PXE_DHCP4_FUNCTION          function;\r
-\r
-  //\r
-  // Timeout event and flag for PxeDhcp4Callback.\r
-  //\r
-  EFI_EVENT                       TimeoutEvent;\r
-  BOOLEAN                         TimeoutOccurred;\r
-\r
-  //\r
-  // Periodic event and flag for PxeDhcp4Callback.\r
-  //\r
-  EFI_EVENT                       PeriodicEvent;\r
-  BOOLEAN                         PeriodicOccurred;\r
-\r
-  //\r
-  // DHCP server IP address.\r
-  //\r
-  UINT32                          ServerIp;\r
-\r
-  //\r
-  // DHCP renewal and rebinding times, in seconds.\r
-  //\r
-  UINT32                          RenewTime;\r
-  UINT32                          RebindTime;\r
-  UINT32                          LeaseTime;\r
-\r
-  //\r
-  // Number of offers received & allocated offer list.\r
-  //\r
-  UINTN                           offers;\r
-  DHCP4_PACKET                    *offer_list;\r
-\r
-  //\r
-  //\r
-  //\r
-  BOOLEAN                         StopPxeBc;\r
-\r
-} PXE_DHCP4_PRIVATE_DATA;\r
-\r
-#define PXE_DHCP4_PRIVATE_DATA_FROM_THIS(a) CR (a, PXE_DHCP4_PRIVATE_DATA, PxeDhcp4, PXE_DHCP4_PRIVATE_DATA_SIGNATURE)\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// Protocol function prototypes.\r
-//\r
-extern\r
-EFI_STATUS \r
-EFIAPI\r
-PxeDhcp4Run (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  IN OPTIONAL UINTN                  OpLen,\r
-  IN OPTIONAL VOID                   *OpList\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-EFIAPI\r
-PxeDhcp4Setup (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  IN EFI_PXE_DHCP4_DATA     *Data\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-EFIAPI\r
-PxeDhcp4Init (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  IN UINTN                  seconds_timeout,\r
-  OUT UINTN                 *offer_list_entries,\r
-  OUT DHCP4_PACKET          **offer_list\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-EFIAPI\r
-PxeDhcp4Select (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  IN UINTN                  seconds_timeout,\r
-  IN DHCP4_PACKET           *offer_list\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-EFIAPI\r
-PxeDhcp4Renew (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  UINTN                     seconds_timeout\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-EFIAPI\r
-PxeDhcp4Rebind (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  UINTN                     seconds_timeout\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-EFIAPI\r
-PxeDhcp4Release (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This\r
-  );\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// Support function prototypes.\r
-//\r
-extern\r
-UINT16 \r
-htons (\r
-  UINTN n\r
-  );\r
-\r
-extern\r
-UINT32 \r
-htonl (\r
-  UINTN n\r
-  );\r
-\r
-extern\r
-VOID \r
-EFIAPI\r
-timeout_notify (\r
-  IN EFI_EVENT Event,\r
-  IN VOID      *Context\r
-  );\r
-\r
-extern\r
-VOID \r
-EFIAPI\r
-periodic_notify (\r
-  IN EFI_EVENT Event,\r
-  IN VOID      *Context\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-find_opt (\r
-  IN DHCP4_PACKET *Packet,\r
-  IN UINT8        OpCode,\r
-  IN UINTN        Skip,\r
-  OUT DHCP4_OP    **OpPtr\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-add_opt (\r
-  IN DHCP4_PACKET *Packet,\r
-  IN DHCP4_OP     *OpPtr\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-start_udp (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  IN OPTIONAL EFI_IP_ADDRESS         *station_ip,\r
-  IN OPTIONAL EFI_IP_ADDRESS         *subnet_mask\r
-  );\r
-\r
-extern\r
-VOID \r
-stop_udp (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-start_receive_events (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  IN UINTN                  seconds_timeout\r
-  );\r
-\r
-extern\r
-VOID \r
-stop_receive_events (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-tx_udp (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  IN EFI_IP_ADDRESS         *dest_ip,\r
-  IN OPTIONAL EFI_IP_ADDRESS         *gateway_ip,\r
-  IN EFI_IP_ADDRESS         *src_ip,\r
-  IN VOID                   *buffer,\r
-  IN UINTN                  BufferSize\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-rx_udp (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  OUT VOID                  *buffer,\r
-  OUT UINTN                 *BufferSize,\r
-  IN OUT EFI_IP_ADDRESS     *dest_ip,\r
-  IN OUT EFI_IP_ADDRESS     *src_ip,\r
-  IN UINT16                 op_flags\r
-  );\r
-\r
-extern\r
-EFI_STATUS \r
-tx_rx_udp (\r
-  IN PXE_DHCP4_PRIVATE_DATA    *Private,\r
-  IN OUT EFI_IP_ADDRESS        *ServerIp,\r
-  IN OPTIONAL EFI_IP_ADDRESS   *gateway_ip,\r
-  IN OPTIONAL EFI_IP_ADDRESS   *client_ip,\r
-  IN OPTIONAL EFI_IP_ADDRESS   *subnet_mask,\r
-  IN DHCP4_PACKET              *tx_pkt,\r
-  OUT DHCP4_PACKET             *rx_pkt,\r
-  IN INTN\r
-    (\r
-  *rx_vfy)\r
-    (\r
-      IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-      IN DHCP4_PACKET *tx_pkt,\r
-      IN DHCP4_PACKET *rx_pkt,\r
-      IN UINTN rx_pkt_size\r
-    ),\r
-  IN UINTN seconds_timeout\r
-  );\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-//\r
-// Global variable definitions.\r
-//\r
-extern EFI_COMPONENT_NAME_PROTOCOL    gPxeDhcp4ComponentName;\r
-extern EFI_COMPONENT_NAME2_PROTOCOL   gPxeDhcp4ComponentName2;\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4DriverEntryPoint (\r
-  IN EFI_HANDLE        ImageHandle,\r
-  IN EFI_SYSTEM_TABLE  *SystemTable\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Register Driver Binding protocol for this driver.\r
-\r
-Arguments:\r
-  (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
-\r
-Returns:\r
-  EFI_SUCCESS - Driver loaded.\r
-  other       - Driver not loaded.\r
-\r
---*/\r
-;\r
-\r
-#endif /* _PXEDHCP4_H */\r
-\r
-/* EOF - PxeDhcp4.h */\r
diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Dxe.inf b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Dxe.inf
deleted file mode 100644 (file)
index ab5fd96..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-#/** @file\r
-# Component name for module PxeDhcp4\r
-#\r
-# Copyright (c) 2007, Intel Corporation\r
-#\r
-#  All rights reserved. This program and the accompanying materials\r
-#  are licensed and made available under the terms and conditions of the BSD License\r
-#  which accompanies this distribution. The full text of the license may be found at\r
-#  http://opensource.org/licenses/bsd-license.php\r
-#\r
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-#\r
-#\r
-#**/\r
-\r
-[Defines]\r
-  INF_VERSION                    = 0x00010005\r
-  BASE_NAME                      = PxeDhcp4Dxe\r
-  FILE_GUID                      = a46c3330-be36-4977-9d24-a7cf92eef0fe\r
-  MODULE_TYPE                    = UEFI_DRIVER\r
-  VERSION_STRING                 = 1.0\r
-  ENTRY_POINT                    = PxeDhcp4DriverEntryPoint\r
-\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
-#\r
-#  DRIVER_BINDING                =  gPxeDhcp4DriverBinding                        \r
-#  COMPONENT_NAME                =  gPxeDhcp4ComponentName\r
-#  COMPONENT_NAME2               =  gPxeDhcp4ComponentName2\r
-#\r
-\r
-[Sources.common]\r
-  Support.c\r
-  PxeDhcp4Release.c\r
-  PxeDhcp4Setup.c\r
-  ComponentName.c\r
-  PxeDhcp4RenewRebind.c\r
-  PxeDhcp4.h\r
-  PxeDhcp4.c\r
-  PxeDhcp4InitSelect.c\r
-  PxeDhcp4Run.c\r
-\r
-\r
-[Packages]\r
-  MdePkg/MdePkg.dec\r
-  MdeModulePkg/MdeModulePkg.dec\r
-\r
-\r
-[LibraryClasses]\r
-  UefiLib\r
-  UefiBootServicesTableLib\r
-  UefiDriverEntryPoint\r
-  BaseMemoryLib\r
-  DebugLib\r
-\r
-\r
-[Protocols]\r
-  gEfiPxeBaseCodeProtocolGuid                   # PROTOCOL ALWAYS_CONSUMED\r
-  gEfiSimpleNetworkProtocolGuid                 # PROTOCOL ALWAYS_CONSUMED\r
-  gEfiPxeDhcp4CallbackProtocolGuid              # PROTOCOL ALWAYS_CONSUMED\r
-  gEfiPxeDhcp4ProtocolGuid                      # PROTOCOL ALWAYS_CONSUMED\r
-\r
diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4InitSelect.c b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4InitSelect.c
deleted file mode 100644 (file)
index 81d3a7e..0000000
+++ /dev/null
@@ -1,768 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeDhcp4InitSelect.c\r
-\r
-Abstract:\r
-\r
-\r
-**/\r
-\r
-\r
-#include "PxeDhcp4.h"\r
-\r
-#define DebugPrint(x)\r
-//\r
-// #define DebugPrint(x) Aprint x\r
-//\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-**/\r
-INTN\r
-offer_verify (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  IN DHCP4_PACKET           *tx_pkt,\r
-  IN DHCP4_PACKET           *rx_pkt,\r
-  IN UINTN                  rx_pkt_size\r
-  )\r
-{\r
-  EFI_STATUS    EfiStatus;\r
-  DHCP4_PACKET  *tmp;\r
-  DHCP4_OP      *msg_type_op;\r
-  DHCP4_OP      *srvid_op;\r
-  UINT32        magik;\r
-\r
-  //\r
-  // Verify parameters.  Touch unused parameters to keep\r
-  // compiler happy.\r
-  //\r
-  ASSERT (Private);\r
-  ASSERT (rx_pkt);\r
-\r
-  if (Private == NULL || rx_pkt == NULL) {\r
-    return -2;\r
-  }\r
-\r
-  tx_pkt      = tx_pkt;\r
-  rx_pkt_size = rx_pkt_size;\r
-\r
-  //\r
-  // This may be a BOOTP Reply or DHCP Offer packet.\r
-  // If there is no DHCP magik number, assume that\r
-  // this is a BOOTP Reply packet.\r
-  //\r
-  magik = htonl (DHCP4_MAGIK_NUMBER);\r
-\r
-  while (!CompareMem (&rx_pkt->dhcp4.magik, &magik, 4)) {\r
-    //\r
-    // If there is no DHCP message type option, assume\r
-    // this is a BOOTP reply packet and cache it.\r
-    //\r
-    EfiStatus = find_opt (rx_pkt, DHCP4_MESSAGE_TYPE, 0, &msg_type_op);\r
-\r
-    if (EFI_ERROR (EfiStatus)) {\r
-      break;\r
-    }\r
-    //\r
-    // If there is a DHCP message type option, it must be a\r
-    // DHCP offer packet\r
-    //\r
-    if (msg_type_op->len != 1) {\r
-      return -1;\r
-    }\r
-\r
-    if (msg_type_op->data[0] != DHCP4_MESSAGE_TYPE_OFFER) {\r
-      return -1;\r
-    }\r
-    //\r
-    // There must be a server identifier option.\r
-    //\r
-    EfiStatus = find_opt (\r
-                  rx_pkt,\r
-                  DHCP4_SERVER_IDENTIFIER,\r
-                  0,\r
-                  &srvid_op\r
-                  );\r
-\r
-    if (EFI_ERROR (EfiStatus)) {\r
-      return -1;\r
-    }\r
-\r
-    if (srvid_op->len != 4) {\r
-      return -1;\r
-    }\r
-    //\r
-    // Good DHCP offer packet.\r
-    //\r
-    break;\r
-  }\r
-  //\r
-  // Good DHCP (or BOOTP) packet.  Cache it!\r
-  //\r
-  EfiStatus = gBS->AllocatePool (\r
-                    EfiBootServicesData,\r
-                    (Private->offers + 1) * sizeof (DHCP4_PACKET),\r
-                    (VOID **) &tmp\r
-                    );\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    return -2;\r
-  }\r
-\r
-  ASSERT (tmp);\r
-\r
-  if (Private->offers != 0) {\r
-    CopyMem (\r
-      tmp,\r
-      Private->offer_list,\r
-      Private->offers * sizeof (DHCP4_PACKET)\r
-      );\r
-\r
-    gBS->FreePool (Private->offer_list);\r
-  }\r
-\r
-  CopyMem (&tmp[Private->offers++], rx_pkt, sizeof (DHCP4_PACKET));\r
-\r
-  Private->offer_list = tmp;\r
-\r
-  return 0;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-**/\r
-INTN\r
-acknak_verify_initselect (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  IN DHCP4_PACKET           *tx_pkt,\r
-  IN DHCP4_PACKET           *rx_pkt,\r
-  IN UINTN                  rx_pkt_size\r
-  )\r
-{\r
-  EFI_STATUS  EfiStatus;\r
-  DHCP4_OP    *msg_type_op;\r
-  DHCP4_OP    *srvid_op;\r
-  DHCP4_OP    *renew_op;\r
-  DHCP4_OP    *rebind_op;\r
-  DHCP4_OP    *lease_time_op;\r
-  UINT32      magik;\r
-\r
-  //\r
-  // Verify parameters.  Touch unused parameters to\r
-  // keep compiler happy.\r
-  //\r
-  ASSERT (Private);\r
-  ASSERT (rx_pkt);\r
-\r
-  if (Private == NULL || rx_pkt == NULL) {\r
-    return -2;\r
-  }\r
-\r
-  tx_pkt      = tx_pkt;\r
-  rx_pkt_size = rx_pkt_size;\r
-\r
-  //\r
-  // This must be a DHCP Ack message.\r
-  //\r
-  magik = htonl (DHCP4_MAGIK_NUMBER);\r
-\r
-  if (CompareMem (&rx_pkt->dhcp4.magik, &magik, 4)) {\r
-    return -1;\r
-  }\r
-\r
-  EfiStatus = find_opt (rx_pkt, DHCP4_MESSAGE_TYPE, 0, &msg_type_op);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    return -1;\r
-  }\r
-\r
-  if (msg_type_op->len != 1) {\r
-    return -1;\r
-  }\r
-\r
-  if (msg_type_op->data[0] != DHCP4_MESSAGE_TYPE_ACK) {\r
-    return -1;\r
-  }\r
-  //\r
-  // There must be a server identifier.\r
-  //\r
-  EfiStatus = find_opt (rx_pkt, DHCP4_SERVER_IDENTIFIER, 0, &srvid_op);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    return -1;\r
-  }\r
-\r
-  if (srvid_op->len != 4) {\r
-    return -1;\r
-  }\r
-  //\r
-  // There should be a renewal time.\r
-  // If there is not, we will default to the 7/8 of the rebinding time.\r
-  //\r
-  EfiStatus = find_opt (rx_pkt, DHCP4_RENEWAL_TIME, 0, &renew_op);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    renew_op = NULL;\r
-  } else if (renew_op->len != 4) {\r
-    renew_op = NULL;\r
-  }\r
-  //\r
-  // There should be a rebinding time.\r
-  // If there is not, we will default to 7/8 of the lease time.\r
-  //\r
-  EfiStatus = find_opt (rx_pkt, DHCP4_REBINDING_TIME, 0, &rebind_op);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    rebind_op = NULL;\r
-  } else if (rebind_op->len != 4) {\r
-    rebind_op = NULL;\r
-  }\r
-  //\r
-  // There should be a lease time.\r
-  // If there is not, we will default to one week.\r
-  //\r
-  EfiStatus = find_opt (rx_pkt, DHCP4_LEASE_TIME, 0, &lease_time_op);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    lease_time_op = NULL;\r
-  } else if (lease_time_op->len != 4) {\r
-    lease_time_op = NULL;\r
-  }\r
-  //\r
-  // Packet looks good.  Double check the renew, rebind and lease times.\r
-  //\r
-  CopyMem (&Private->ServerIp, srvid_op->data, 4);\r
-\r
-  if (renew_op != NULL) {\r
-    CopyMem (&Private->RenewTime, renew_op->data, 4);\r
-    Private->RenewTime = htonl (Private->RenewTime);\r
-  } else {\r
-    Private->RenewTime = 0;\r
-  }\r
-\r
-  if (rebind_op != NULL) {\r
-    CopyMem (&Private->RebindTime, rebind_op->data, 4);\r
-    Private->RebindTime = htonl (Private->RebindTime);\r
-  } else {\r
-    Private->RebindTime = 0;\r
-  }\r
-\r
-  if (lease_time_op != NULL) {\r
-    CopyMem (&Private->LeaseTime, lease_time_op->data, 4);\r
-    Private->LeaseTime = htonl (Private->LeaseTime);\r
-  } else {\r
-    Private->LeaseTime = 0;\r
-  }\r
-\r
-  if (Private->LeaseTime < 60) {\r
-    Private->LeaseTime = 7 * 86400;\r
-  }\r
-\r
-  if (Private->RebindTime < 52 || Private->RebindTime >= Private->LeaseTime) {\r
-    Private->RebindTime = Private->LeaseTime / 2 + Private->LeaseTime / 4 + Private->LeaseTime / 8;\r
-  }\r
-\r
-  if (Private->RenewTime < 45 || Private->RenewTime >= Private->RebindTime) {\r
-    Private->RenewTime = Private->RebindTime / 2 + Private->RebindTime / 4 + Private->RebindTime / 8;\r
-  }\r
-\r
-  return 1;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4Init (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  IN UINTN                  seconds_timeout,\r
-  OUT UINTN                 *Offers,\r
-  OUT DHCP4_PACKET          **OfferList\r
-  )\r
-{\r
-  PXE_DHCP4_PRIVATE_DATA  *Private;\r
-  DHCP4_PACKET            offer;\r
-  EFI_IP_ADDRESS          bcast_ip;\r
-  EFI_STATUS              EfiStatus;\r
-\r
-  //\r
-  // Verify parameters and protocol state.\r
-  //\r
-  if (This == NULL ||\r
-      seconds_timeout < DHCP4_MIN_SECONDS ||\r
-      seconds_timeout > DHCP4_MAX_SECONDS ||\r
-      Offers == NULL ||\r
-      OfferList == NULL\r
-      ) {\r
-    //\r
-    // Return parameters are not initialized when\r
-    // parameters are invalid!\r
-    //\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  *Offers     = 0;\r
-  *OfferList  = NULL;\r
-\r
-  //\r
-  // Check protocol state.\r
-  //\r
-  if (This->Data == NULL) {\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  if (!This->Data->SetupCompleted) {\r
-    return EFI_NOT_READY;\r
-  }\r
-\r
-  //\r
-  // Get pointer to our instance data.\r
-  //\r
-  Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  if (Private == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Private->PxeBc == NULL) {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  //\r
-  // Setup variables...\r
-  //\r
-  Private->offers     = 0;\r
-  Private->offer_list = NULL;\r
-\r
-  EfiStatus = gBS->HandleProtocol (\r
-                    Private->Handle,\r
-                    &gEfiPxeDhcp4CallbackProtocolGuid,\r
-                    (VOID *) &Private->callback\r
-                    );\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    Private->callback = NULL;\r
-  }\r
-\r
-  Private->function = EFI_PXE_DHCP4_FUNCTION_INIT;\r
-\r
-  //\r
-  // Increment the transaction ID.\r
-  //\r
-  {\r
-    UINT32  xid;\r
-\r
-    CopyMem (&xid, &This->Data->Discover.dhcp4.xid, sizeof (UINT32));\r
-\r
-    xid = htonl (htonl (xid) + 1);\r
-\r
-    CopyMem (&This->Data->Discover.dhcp4.xid, &xid, sizeof (UINT32));\r
-  }\r
-  //\r
-  // Transmit discover and wait for offers...\r
-  //\r
-  SetMem (&bcast_ip, sizeof (EFI_IP_ADDRESS), 0xFF);\r
-\r
-  EfiStatus = tx_rx_udp (\r
-                Private,\r
-                &bcast_ip,\r
-                NULL,\r
-                NULL,\r
-                NULL,\r
-                &This->Data->Discover,\r
-                &offer,\r
-                &offer_verify,\r
-                seconds_timeout\r
-                );\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    if (Private->offer_list) {\r
-      gBS->FreePool (Private->offer_list);\r
-    }\r
-\r
-    Private->offers     = 0;\r
-    Private->offer_list = NULL;\r
-    Private->callback   = NULL;\r
-\r
-    DebugPrint (("%a:%d:%r\n", __FILE__, __LINE__, EfiStatus));\r
-    return EfiStatus;\r
-  }\r
-\r
-  *Offers                     = Private->offers;\r
-  *OfferList                  = Private->offer_list;\r
-\r
-  Private->offers             = 0;\r
-  Private->offer_list         = NULL;\r
-  Private->callback           = NULL;\r
-\r
-  This->Data->InitCompleted   = TRUE;\r
-  This->Data->SelectCompleted = FALSE;\r
-  This->Data->IsBootp         = FALSE;\r
-  This->Data->IsAck           = FALSE;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4Select (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  IN UINTN                  seconds_timeout,\r
-  IN DHCP4_PACKET           *Offer\r
-  )\r
-{\r
-  PXE_DHCP4_PRIVATE_DATA  *Private;\r
-  EFI_STATUS              EfiStatus;\r
-  DHCP4_PACKET            request;\r
-  DHCP4_PACKET            acknak;\r
-  EFI_IP_ADDRESS          bcast_ip;\r
-  EFI_IP_ADDRESS          zero_ip;\r
-  EFI_IP_ADDRESS          local_ip;\r
-  DHCP4_OP                *srvid;\r
-  DHCP4_OP                *op;\r
-  UINT32                  dhcp4_magik;\r
-  UINT8                   buf[16];\r
-  BOOLEAN                 is_bootp;\r
-\r
-  //\r
-  // Verify parameters.\r
-  //\r
-  if (This == NULL || seconds_timeout < DHCP4_MIN_SECONDS || seconds_timeout > DHCP4_MAX_SECONDS || Offer == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Check protocol state.\r
-  //\r
-  if (This->Data == NULL) {\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  if (!This->Data->SetupCompleted) {\r
-    return EFI_NOT_READY;\r
-  }\r
-  //\r
-  // Get pointer to instance data.\r
-  //\r
-  Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  if (Private == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Private->PxeBc == NULL) {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  //\r
-  // Setup useful variables...\r
-  //\r
-  SetMem (&bcast_ip, sizeof (EFI_IP_ADDRESS), 0xFF);\r
-\r
-  ZeroMem (&zero_ip, sizeof (EFI_IP_ADDRESS));\r
-\r
-  ZeroMem (&local_ip, sizeof (EFI_IP_ADDRESS));\r
-  local_ip.v4.Addr[0]         = 127;\r
-  local_ip.v4.Addr[3]         = 1;\r
-\r
-  This->Data->SelectCompleted = FALSE;\r
-  This->Data->IsBootp         = FALSE;\r
-  This->Data->IsAck           = FALSE;\r
-\r
-  EfiStatus = gBS->HandleProtocol (\r
-                    Private->Handle,\r
-                    &gEfiPxeDhcp4CallbackProtocolGuid,\r
-                    (VOID *) &Private->callback\r
-                    );\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    Private->callback = NULL;\r
-  }\r
-\r
-  Private->function = EFI_PXE_DHCP4_FUNCTION_SELECT;\r
-\r
-  //\r
-  // Verify offer packet fields.\r
-  //\r
-  if (Offer->dhcp4.op != BOOTP_REPLY) {\r
-    Private->callback = NULL;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Offer->dhcp4.htype != This->Data->Discover.dhcp4.htype) {\r
-    Private->callback = NULL;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Offer->dhcp4.hlen != This->Data->Discover.dhcp4.hlen) {\r
-    Private->callback = NULL;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (CompareMem (&Offer->dhcp4.xid, &This->Data->Discover.dhcp4.xid, 4)) {\r
-    Private->callback = NULL;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (!CompareMem (&Offer->dhcp4.yiaddr, &bcast_ip, 4)) {\r
-    Private->callback = NULL;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (!CompareMem (&Offer->dhcp4.yiaddr, &zero_ip, 4)) {\r
-    Private->callback = NULL;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (!CompareMem (&Offer->dhcp4.yiaddr, &local_ip, 4)) {\r
-    Private->callback = NULL;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (CompareMem (\r
-        &Offer->dhcp4.chaddr,\r
-        &This->Data->Discover.dhcp4.chaddr,\r
-        16\r
-        )) {\r
-    Private->callback = NULL;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // DHCP option checks\r
-  //\r
-  dhcp4_magik = htonl (DHCP4_MAGIK_NUMBER);\r
-  is_bootp    = TRUE;\r
-\r
-  if (!CompareMem (&Offer->dhcp4.magik, &dhcp4_magik, 4)) {\r
-    //\r
-    // If present, DHCP message type must be offer.\r
-    //\r
-    EfiStatus = find_opt (Offer, DHCP4_MESSAGE_TYPE, 0, &op);\r
-\r
-    if (!EFI_ERROR (EfiStatus)) {\r
-      if (op->len != 1 || op->data[0] != DHCP4_MESSAGE_TYPE_OFFER) {\r
-        Private->callback = NULL;\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-\r
-      is_bootp = FALSE;\r
-    }\r
-    //\r
-    // If present, DHCP max message size must be valid.\r
-    //\r
-    EfiStatus = find_opt (Offer, DHCP4_MAX_MESSAGE_SIZE, 0, &op);\r
-\r
-    if (!EFI_ERROR (EfiStatus)) {\r
-      if (op->len != 2 || ((op->data[0] << 8) | op->data[1]) < DHCP4_DEFAULT_MAX_MESSAGE_SIZE) {\r
-        Private->callback = NULL;\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    }\r
-    //\r
-    // If present, DHCP server identifier must be valid.\r
-    //\r
-    EfiStatus = find_opt (Offer, DHCP4_SERVER_IDENTIFIER, 0, &op);\r
-\r
-    if (!EFI_ERROR (EfiStatus)) {\r
-      if (op->len != 4 || !CompareMem (op->data, &bcast_ip, 4) || !CompareMem (op->data, &zero_ip, 4)) {\r
-        Private->callback = NULL;\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    }\r
-    //\r
-    // If present, DHCP subnet mask must be valid.\r
-    //\r
-    EfiStatus = find_opt (\r
-                  Offer,\r
-                  DHCP4_SUBNET_MASK,\r
-                  0,\r
-                  &op\r
-                  );\r
-\r
-    if (!EFI_ERROR (EfiStatus)) {\r
-      if (op->len != 4) {\r
-        Private->callback = NULL;\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    }\r
-  }\r
-  //\r
-  // Early out for BOOTP.\r
-  //\r
-  This->Data->IsBootp = is_bootp;\r
-  if (is_bootp) {\r
-    //\r
-    // Copy offer packet to instance data.\r
-    //\r
-    CopyMem (&This->Data->Offer, Offer, sizeof (DHCP4_PACKET));\r
-\r
-    //\r
-    // Copy discover to request and offer to acknak.\r
-    //\r
-    CopyMem (\r
-      &This->Data->Request,\r
-      &This->Data->Discover,\r
-      sizeof (DHCP4_PACKET)\r
-      );\r
-\r
-    CopyMem (\r
-      &This->Data->AckNak,\r
-      &This->Data->Offer,\r
-      sizeof (DHCP4_PACKET)\r
-      );\r
-\r
-    //\r
-    // Set state flags.\r
-    //\r
-    This->Data->SelectCompleted = TRUE;\r
-    This->Data->IsAck           = TRUE;\r
-\r
-    Private->callback           = NULL;\r
-    return EFI_SUCCESS;\r
-  }\r
-  //\r
-  // Copy discover packet contents to request packet.\r
-  //\r
-  CopyMem (&request, &This->Data->Discover, sizeof (DHCP4_PACKET));\r
-\r
-  This->Data->IsAck = FALSE;\r
-\r
-  //\r
-  // Change DHCP message type from discover to request.\r
-  //\r
-  EfiStatus = find_opt (&request, DHCP4_MESSAGE_TYPE, 0, &op);\r
-\r
-  if (EFI_ERROR (EfiStatus) && EfiStatus != EFI_NOT_FOUND) {\r
-    Private->callback = NULL;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (EfiStatus == EFI_NOT_FOUND) {\r
-    EfiStatus = find_opt (&request, DHCP4_END, 0, &op);\r
-\r
-    if (EFI_ERROR (EfiStatus)) {\r
-      Private->callback = NULL;\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    op->op      = DHCP4_MESSAGE_TYPE;\r
-    op->len     = 1;\r
-\r
-    op->data[1] = DHCP4_END;\r
-  }\r
-\r
-  op->data[0] = DHCP4_MESSAGE_TYPE_REQUEST;\r
-\r
-  //\r
-  // Copy server identifier option from offer to request.\r
-  //\r
-  EfiStatus = find_opt (Offer, DHCP4_SERVER_IDENTIFIER, 0, &srvid);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    Private->callback = NULL;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (srvid->len != 4) {\r
-    Private->callback = NULL;\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  EfiStatus = add_opt (&request, srvid);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    DebugPrint (("%a:%d:%r\n", __FILE__, __LINE__, EfiStatus));\r
-    Private->callback = NULL;\r
-    return EfiStatus;\r
-  }\r
-  //\r
-  // Add requested IP address option to request packet.\r
-  //\r
-  op      = (DHCP4_OP *) buf;\r
-  op->op  = DHCP4_REQUESTED_IP_ADDRESS;\r
-  op->len = 4;\r
-  CopyMem (op->data, &Offer->dhcp4.yiaddr, 4);\r
-\r
-  EfiStatus = add_opt (&request, op);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    DebugPrint (("%a:%d:%r\n", __FILE__, __LINE__, EfiStatus));\r
-    Private->callback = NULL;\r
-    return EfiStatus;\r
-  }\r
-  //\r
-  // Transimit DHCP request and wait for DHCP ack...\r
-  //\r
-  SetMem (&bcast_ip, sizeof (EFI_IP_ADDRESS), 0xFF);\r
-\r
-  EfiStatus = tx_rx_udp (\r
-                Private,\r
-                &bcast_ip,\r
-                NULL,\r
-                NULL,\r
-                NULL,\r
-                &request,\r
-                &acknak,\r
-                &acknak_verify_initselect,\r
-                seconds_timeout\r
-                );\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    DebugPrint (("%a:%d:%r\n", __FILE__, __LINE__, EfiStatus));\r
-    Private->callback = NULL;\r
-    return EfiStatus;\r
-  }\r
-  //\r
-  // Set Data->IsAck and return.\r
-  //\r
-  EfiStatus = find_opt (&acknak, DHCP4_MESSAGE_TYPE, 0, &op);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    Private->callback = NULL;\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  if (op->len != 1) {\r
-    Private->callback = NULL;\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  switch (op->data[0]) {\r
-  case DHCP4_MESSAGE_TYPE_ACK:\r
-    This->Data->IsAck = TRUE;\r
-    break;\r
-\r
-  case DHCP4_MESSAGE_TYPE_NAK:\r
-    This->Data->IsAck = FALSE;\r
-    break;\r
-\r
-  default:\r
-    Private->callback = NULL;\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  //\r
-  // Copy packets into instance data...\r
-  //\r
-  CopyMem (&This->Data->Offer, Offer, sizeof (DHCP4_PACKET));\r
-  CopyMem (&This->Data->Request, &request, sizeof (DHCP4_PACKET));\r
-  CopyMem (&This->Data->AckNak, &acknak, sizeof (DHCP4_PACKET));\r
-\r
-  This->Data->SelectCompleted = TRUE;\r
-\r
-  Private->callback           = NULL;\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/* eof - PxeDhcp4InitSelect.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Release.c b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Release.c
deleted file mode 100644 (file)
index 119acff..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeDhcp4Release.c\r
-\r
-Abstract:\r
-  Transmit release packet, free allocations and shutdown PxeDhcp4.\r
-\r
-\r
-**/\r
-\r
-\r
-#include "PxeDhcp4.h"\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4Release (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This\r
-  )\r
-{\r
-  PXE_DHCP4_PRIVATE_DATA  *Private;\r
-  EFI_IP_ADDRESS          ServerIp;\r
-  EFI_IP_ADDRESS          client_ip;\r
-  EFI_IP_ADDRESS          gateway_ip;\r
-  EFI_IP_ADDRESS          subnet_mask;\r
-  EFI_STATUS              efi_status;\r
-  DHCP4_OP                *op;\r
-  UINT8                   op_list[20];\r
-\r
-  //\r
-  // Check for invalid parameters.\r
-  //\r
-  if (This == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Release does nothing if the protocol has never been setup.\r
-  //\r
-  if (This->Data == NULL) {\r
-    return EFI_NOT_STARTED;\r
-  }\r
-  //\r
-  // Fail if we do not have valid instance data.\r
-  //\r
-  Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  if (Private == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Private->PxeBc == NULL) {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  //\r
-  // If this is a BOOTP session and there is not a DHCP Ack\r
-  // packet, just release storage and return.\r
-  //\r
-  if (This->Data->IsBootp || !This->Data->IsAck) {\r
-    gBS->FreePool (This->Data);\r
-    This->Data = NULL;\r
-\r
-    if (Private->StopPxeBc) {\r
-      Private->PxeBc->Stop (Private->PxeBc);\r
-    }\r
-\r
-    return EFI_SUCCESS;\r
-  }\r
-  //\r
-  // Build option list for DHCP Release packet.\r
-  // If any errors occur, just release storage and return.\r
-  //\r
-  //\r
-  // Message type is first.\r
-  //\r
-  op_list[0]  = DHCP4_MESSAGE_TYPE;\r
-  op_list[1]  = 1;\r
-  op_list[2]  = DHCP4_MESSAGE_TYPE_RELEASE;\r
-\r
-  //\r
-  // Followed by server identifier.\r
-  //\r
-  efi_status = find_opt (\r
-                &This->Data->Request,\r
-                DHCP4_SERVER_IDENTIFIER,\r
-                0,\r
-                &op\r
-                );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    gBS->FreePool (This->Data);\r
-    This->Data = NULL;\r
-\r
-    if (Private->StopPxeBc) {\r
-      Private->PxeBc->Stop (Private->PxeBc);\r
-    }\r
-\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  if (op->len != 4) {\r
-    gBS->FreePool (This->Data);\r
-    This->Data = NULL;\r
-\r
-    if (Private->StopPxeBc) {\r
-      Private->PxeBc->Stop (Private->PxeBc);\r
-    }\r
-\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  CopyMem (&ServerIp, op->data, 4);\r
-\r
-  op_list[3]  = DHCP4_SERVER_IDENTIFIER;\r
-  op_list[4]  = 4;\r
-  CopyMem (&op_list[5], &ServerIp, 4);\r
-\r
-  //\r
-  // Followed by end.\r
-  //\r
-  op_list[9] = DHCP4_END;\r
-\r
-  //\r
-  // We need a subnet mask for IP stack operation.\r
-  //\r
-  efi_status = find_opt (\r
-                &This->Data->AckNak,\r
-                DHCP4_SUBNET_MASK,\r
-                0,\r
-                &op\r
-                );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    gBS->FreePool (This->Data);\r
-    This->Data = NULL;\r
-\r
-    if (Private->StopPxeBc) {\r
-      Private->PxeBc->Stop (Private->PxeBc);\r
-    }\r
-\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  if (op->len != 4) {\r
-    gBS->FreePool (This->Data);\r
-    This->Data = NULL;\r
-\r
-    if (Private->StopPxeBc) {\r
-      Private->PxeBc->Stop (Private->PxeBc);\r
-    }\r
-\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  ZeroMem (&subnet_mask, sizeof (EFI_IP_ADDRESS));\r
-  CopyMem (&subnet_mask, op->data, 4);\r
-\r
-  //\r
-  // Gateway IP address may be needed.\r
-  //\r
-  ZeroMem (&gateway_ip, sizeof (EFI_IP_ADDRESS));\r
-  CopyMem (&gateway_ip, &This->Data->AckNak.dhcp4.giaddr, 4);\r
-\r
-  //\r
-  // Client IP address needed for IP stack operation.\r
-  //\r
-  ZeroMem (&client_ip, sizeof (EFI_IP_ADDRESS));\r
-  CopyMem (&client_ip, &This->Data->AckNak.dhcp4.yiaddr, 4);\r
-\r
-  //\r
-  // Enable UDP...\r
-  //\r
-  efi_status = start_udp (Private, &client_ip, &subnet_mask);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    gBS->FreePool (This->Data);\r
-    This->Data = NULL;\r
-\r
-    if (Private->StopPxeBc) {\r
-      Private->PxeBc->Stop (Private->PxeBc);\r
-    }\r
-\r
-    return efi_status;\r
-  }\r
-  //\r
-  // Gather information out of DHCP request packet needed for\r
-  // DHCP release packet.\r
-  //\r
-  //\r
-  // Setup DHCP Release packet.\r
-  //\r
-  CopyMem (&This->Data->Request.dhcp4.ciaddr, &client_ip, 4);\r
-\r
-  ZeroMem (&This->Data->Request.dhcp4.yiaddr, 12);\r
-\r
-  ZeroMem (&This->Data->Request.dhcp4.sname, 64 + 128);\r
-\r
-  This->Data->Request.dhcp4.hops  = 0;\r
-  This->Data->Request.dhcp4.secs  = 0;\r
-  This->Data->Request.dhcp4.flags = 0;\r
-\r
-  ZeroMem (\r
-    &This->Data->Request.dhcp4.options,\r
-    sizeof This->Data->Request.dhcp4.options\r
-    );\r
-\r
-  CopyMem (&This->Data->Request.dhcp4.options, op_list, 10);\r
-\r
-  //\r
-  // Transmit DHCP Release packet.\r
-  //\r
-  tx_udp (\r
-    Private,\r
-    &ServerIp,\r
-    &gateway_ip,\r
-    &client_ip,\r
-    &This->Data->Request,\r
-    DHCP4_MAX_PACKET_SIZE - (DHCP4_UDP_HEADER_SIZE + DHCP4_IP_HEADER_SIZE)\r
-    );\r
-\r
-  gBS->Stall (1000000); /* 1/10th second */\r
-\r
-  //\r
-  // Shutdown PXE BaseCode and release local storage.\r
-  //\r
-  stop_udp (Private);\r
-\r
-  gBS->FreePool (This->Data);\r
-  This->Data = NULL;\r
-\r
-  if (Private->StopPxeBc) {\r
-    Private->PxeBc->Stop (Private->PxeBc);\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/* eof - PxeDhcp4Release.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4RenewRebind.c b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4RenewRebind.c
deleted file mode 100644 (file)
index fb317a5..0000000
+++ /dev/null
@@ -1,406 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeDhcp4RenewRebind.c\r
-\r
-Abstract:\r
-\r
-\r
-**/\r
-\r
-\r
-#include "PxeDhcp4.h"\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-  Parameters:\r
-\r
-  @return -2 = ignore, stop waiting\r
-  @return -1 = ignore, keep waiting\r
-  @return 0 = accept, keep waiting\r
-  @return 1 = accept, stop waiting\r
-\r
-**/\r
-INTN\r
-acknak_verify_renewrebind (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  IN DHCP4_PACKET           *tx_pkt,\r
-  IN DHCP4_PACKET           *rx_pkt,\r
-  IN UINTN                  rx_pkt_size\r
-  )\r
-{\r
-  EFI_STATUS  efi_status;\r
-  DHCP4_OP    *msg_type_op;\r
-  DHCP4_OP    *srvid_op;\r
-  DHCP4_OP    *renew_op;\r
-  DHCP4_OP    *rebind_op;\r
-  DHCP4_OP    *lease_time_op;\r
-  UINT32      magik;\r
-\r
-  //\r
-  // Verify parameters.  Unused parameters are also touched\r
-  // to make the compiler happy.\r
-  //\r
-  ASSERT (Private);\r
-  ASSERT (rx_pkt);\r
-\r
-  if (Private == NULL || rx_pkt == NULL) {\r
-    return -2;\r
-  }\r
-\r
-  tx_pkt      = tx_pkt;\r
-  rx_pkt_size = rx_pkt_size;\r
-\r
-  //\r
-  // This must be a DHCP Ack message.\r
-  //\r
-  magik = htonl (DHCP4_MAGIK_NUMBER);\r
-\r
-  if (CompareMem (&rx_pkt->dhcp4.magik, &magik, 4)) {\r
-    return -1;\r
-  }\r
-\r
-  efi_status = find_opt (rx_pkt, DHCP4_MESSAGE_TYPE, 0, &msg_type_op);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    return -1;\r
-  }\r
-\r
-  if (msg_type_op->len != 1) {\r
-    return -1;\r
-  }\r
-\r
-  if (msg_type_op->data[0] != DHCP4_MESSAGE_TYPE_ACK) {\r
-    return -1;\r
-  }\r
-  //\r
-  // There must be a server identifier.\r
-  //\r
-  efi_status = find_opt (rx_pkt, DHCP4_SERVER_IDENTIFIER, 0, &srvid_op);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    return -1;\r
-  }\r
-\r
-  if (srvid_op->len != 4) {\r
-    return -1;\r
-  }\r
-  //\r
-  // There should be a renewal time.\r
-  // If there is not, we will default to the 7/8 of the rebinding time.\r
-  //\r
-  efi_status = find_opt (rx_pkt, DHCP4_RENEWAL_TIME, 0, &renew_op);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    renew_op = NULL;\r
-  } else if (renew_op->len != 4) {\r
-    renew_op = NULL;\r
-  }\r
-  //\r
-  // There should be a rebinding time.\r
-  // If there is not, we will default to 7/8 of the lease time.\r
-  //\r
-  efi_status = find_opt (rx_pkt, DHCP4_REBINDING_TIME, 0, &rebind_op);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    rebind_op = NULL;\r
-  } else if (rebind_op->len != 4) {\r
-    rebind_op = NULL;\r
-  }\r
-  //\r
-  // There should be a lease time.\r
-  // If there is not, we will default to one week.\r
-  //\r
-  efi_status = find_opt (rx_pkt, DHCP4_LEASE_TIME, 0, &lease_time_op);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    lease_time_op = NULL;\r
-  } else if (lease_time_op->len != 4) {\r
-    lease_time_op = NULL;\r
-  }\r
-  //\r
-  // Packet looks good.  Double check the renew, rebind and lease times.\r
-  //\r
-  CopyMem (&Private->ServerIp, srvid_op->data, 4);\r
-\r
-  if (renew_op != NULL) {\r
-    CopyMem (&Private->RenewTime, renew_op->data, 4);\r
-    Private->RenewTime = htonl (Private->RenewTime);\r
-  } else {\r
-    Private->RenewTime = 0;\r
-  }\r
-\r
-  if (rebind_op != NULL) {\r
-    CopyMem (&Private->RebindTime, rebind_op->data, 4);\r
-    Private->RebindTime = htonl (Private->RebindTime);\r
-  } else {\r
-    Private->RebindTime = 0;\r
-  }\r
-\r
-  if (lease_time_op != NULL) {\r
-    CopyMem (&Private->LeaseTime, lease_time_op->data, 4);\r
-    Private->LeaseTime = htonl (Private->LeaseTime);\r
-  } else {\r
-    Private->LeaseTime = 0;\r
-  }\r
-\r
-  if (Private->LeaseTime < 60) {\r
-    Private->LeaseTime = 7 * 86400;\r
-  }\r
-\r
-  if (Private->RebindTime < 52 || Private->RebindTime >= Private->LeaseTime) {\r
-    Private->RebindTime = Private->LeaseTime / 2 + Private->LeaseTime / 4 + Private->LeaseTime / 8;\r
-  }\r
-\r
-  if (Private->RenewTime < 45 || Private->RenewTime >= Private->RebindTime) {\r
-    Private->RenewTime = Private->RebindTime / 2 + Private->RebindTime / 4 + Private->RebindTime / 8;\r
-  }\r
-\r
-  return 1;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-EFI_STATUS\r
-EFIAPI\r
-renew_rebind (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  IN UINTN                  seconds_timeout,\r
-  IN BOOLEAN                renew\r
-  )\r
-{\r
-  PXE_DHCP4_PRIVATE_DATA  *Private;\r
-  EFI_IP_ADDRESS          ServerIp;\r
-  EFI_IP_ADDRESS          client_ip;\r
-  EFI_IP_ADDRESS          subnet_mask;\r
-  EFI_IP_ADDRESS          gateway_ip;\r
-  DHCP4_PACKET            Request;\r
-  DHCP4_PACKET            AckNak;\r
-  DHCP4_OP                *op;\r
-  EFI_STATUS              efi_status;\r
-\r
-  //\r
-  // Check for invalid parameters.\r
-  //\r
-  if (This == NULL || seconds_timeout < DHCP4_MIN_SECONDS || seconds_timeout > DHCP4_MAX_SECONDS) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Check for proper protocol state.\r
-  //\r
-  if (This->Data == NULL) {\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  if (!This->Data->SelectCompleted) {\r
-    return EFI_NOT_READY;\r
-  }\r
-\r
-  if (This->Data->IsBootp) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  if (!This->Data->IsAck) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Get pointer to instance data.\r
-  //\r
-  Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  if (Private == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Private->PxeBc == NULL) {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  //\r
-  // Copy Discover packet to temporary request packet\r
-  // to be used for Renew/Rebind operation.\r
-  //\r
-  CopyMem (&Request, &This->Data->Discover, sizeof (DHCP4_PACKET));\r
-\r
-  CopyMem (&Request.dhcp4.ciaddr, &This->Data->AckNak.dhcp4.yiaddr, 4);\r
-\r
-  Request.dhcp4.flags = 0;  /* Reply does not need to be broadcast. */\r
-\r
-  //\r
-  // Change message type from discover to request.\r
-  //\r
-  efi_status = find_opt (&Request, DHCP4_MESSAGE_TYPE, 0, &op);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (op->len != 1) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  op->data[0] = DHCP4_MESSAGE_TYPE_REQUEST;\r
-\r
-  //\r
-  // Need a subnet mask.\r
-  //\r
-  efi_status = find_opt (\r
-                &This->Data->AckNak,\r
-                DHCP4_SUBNET_MASK,\r
-                0,\r
-                &op\r
-                );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (op->len != 4) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  ZeroMem (&subnet_mask, sizeof (EFI_IP_ADDRESS));\r
-  CopyMem (&subnet_mask, op->data, 4);\r
-\r
-  //\r
-  // Need a server IP address (renew) or a broadcast\r
-  // IP address (rebind).\r
-  //\r
-  ZeroMem (&gateway_ip, sizeof (EFI_IP_ADDRESS));\r
-\r
-  if (renew) {\r
-    efi_status = find_opt (\r
-                  &This->Data->AckNak,\r
-                  DHCP4_SERVER_IDENTIFIER,\r
-                  0,\r
-                  &op\r
-                  );\r
-\r
-    if (EFI_ERROR (efi_status)) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    if (op->len != 4) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    ZeroMem (&ServerIp, sizeof (EFI_IP_ADDRESS));\r
-    CopyMem (&ServerIp, op->data, 4);\r
-\r
-    //\r
-    //\r
-    //\r
-    if (CompareMem (&This->Data->AckNak.dhcp4.giaddr, &gateway_ip, 4)) {\r
-      CopyMem (&gateway_ip, &This->Data->AckNak.dhcp4.giaddr, 4);\r
-    }\r
-  } else {\r
-    SetMem (&ServerIp, sizeof (EFI_IP_ADDRESS), 0xFF);\r
-  }\r
-  //\r
-  // Need a client IP address.\r
-  //\r
-  ZeroMem (&client_ip, sizeof (EFI_IP_ADDRESS));\r
-  CopyMem (&client_ip, &Request.dhcp4.ciaddr, 4);\r
-\r
-  //\r
-  //\r
-  //\r
-  efi_status = gBS->HandleProtocol (\r
-                      Private->Handle,\r
-                      &gEfiPxeDhcp4CallbackProtocolGuid,\r
-                      (VOID *) &Private->callback\r
-                      );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    Private->callback = NULL;\r
-  }\r
-\r
-  Private->function = renew ? EFI_PXE_DHCP4_FUNCTION_RENEW : EFI_PXE_DHCP4_FUNCTION_REBIND;\r
-\r
-  //\r
-  // Transimit DHCP request and wait for DHCP ack...\r
-  //\r
-  efi_status = tx_rx_udp (\r
-                Private,\r
-                &ServerIp,\r
-                &gateway_ip,\r
-                &client_ip,\r
-                &subnet_mask,\r
-                &Request,\r
-                &AckNak,\r
-                &acknak_verify_renewrebind,\r
-                seconds_timeout\r
-                );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    Private->callback = NULL;\r
-    return efi_status;\r
-  }\r
-  //\r
-  // Copy server identifier, renewal time and rebinding time\r
-  // from temporary ack/nak packet into cached ack/nak packet.\r
-  //\r
-  efi_status = find_opt (\r
-                &This->Data->AckNak,\r
-                DHCP4_SERVER_IDENTIFIER,\r
-                0,\r
-                &op\r
-                );\r
-\r
-  if (!EFI_ERROR (efi_status)) {\r
-    if (op->len == 4) {\r
-      CopyMem (op->data, &Private->ServerIp, 4);\r
-    }\r
-  }\r
-\r
-  efi_status = find_opt (&This->Data->AckNak, DHCP4_RENEWAL_TIME, 0, &op);\r
-\r
-  if (!EFI_ERROR (efi_status)) {\r
-    if (op->len == 4) {\r
-      CopyMem (op->data, &Private->RenewTime, 4);\r
-    }\r
-  }\r
-\r
-  efi_status = find_opt (&This->Data->AckNak, DHCP4_REBINDING_TIME, 0, &op);\r
-\r
-  if (!EFI_ERROR (efi_status)) {\r
-    if (op->len == 4) {\r
-      CopyMem (op->data, &Private->RebindTime, 4);\r
-    }\r
-  }\r
-\r
-  Private->callback = NULL;\r
-  return efi_status;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4Renew (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  IN UINTN                  seconds_timeout\r
-  )\r
-{\r
-  return renew_rebind (This, seconds_timeout, TRUE);\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4Rebind (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  IN UINTN                  seconds_timeout\r
-  )\r
-{\r
-  return renew_rebind (This, seconds_timeout, FALSE);\r
-}\r
-\r
-/* eof - PxeDhcp4RenewRebind.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Run.c b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Run.c
deleted file mode 100644 (file)
index e796d12..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeDhcp4Run.c\r
-\r
-Abstract:\r
-  Simplified entry point for starting basic PxeDhcp4 client operation.\r
-\r
-\r
-**/\r
-\r
-\r
-#include "PxeDhcp4.h"\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4Run (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  IN OPTIONAL UINTN                  OpLen,\r
-  IN OPTIONAL VOID                   *OpList\r
-  )\r
-{\r
-  PXE_DHCP4_PRIVATE_DATA  *Private;\r
-  DHCP4_PACKET            *offer_list;\r
-  EFI_STATUS              efi_status;\r
-  EFI_IP_ADDRESS          zero_ip;\r
-  UINTN                   offers;\r
-  UINTN                   timeout;\r
-  UINTN                   n;\r
-  UINT16                  seconds;\r
-\r
-  //\r
-  // Validate parameters.\r
-  //\r
-  if (This == NULL || (OpLen != 0 && OpList == NULL) || (OpLen == 0 && OpList != NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  for (n = 0; n < OpLen;) {\r
-    switch (((UINT8 *) OpList)[n]) {\r
-    case DHCP4_PAD:\r
-      ++n;\r
-      continue;\r
-\r
-    case DHCP4_END:\r
-      ++n;\r
-      break;\r
-\r
-    default:\r
-      n += 2 + ((UINT8 *) OpList)[n + 1];\r
-      continue;\r
-    }\r
-\r
-    break;\r
-  }\r
-\r
-  if (n != OpLen) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Get pointer to instance data.\r
-  //\r
-  Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  if (Private == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Private->PxeBc == NULL) {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  //\r
-  // Initialize DHCP discover packet.\r
-  //\r
-  efi_status = PxeDhcp4Setup (This, NULL);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    return efi_status;\r
-  }\r
-\r
-  for (n = 0; n < OpLen;) {\r
-    switch (((UINT8 *) OpList)[n]) {\r
-    case DHCP4_PAD:\r
-      ++n;\r
-      continue;\r
-\r
-    case DHCP4_END:\r
-      ++n;\r
-      break;\r
-\r
-    default:\r
-      efi_status = add_opt (\r
-                    &This->Data->Discover,\r
-                    (DHCP4_OP *) &(((UINT8 *) OpList)[n])\r
-                    );\r
-\r
-      if (EFI_ERROR (efi_status)) {\r
-        return efi_status;\r
-      }\r
-\r
-      n += 2 + ((UINT8 *) OpList)[n + 1];\r
-      continue;\r
-    }\r
-\r
-    break;\r
-  }\r
-  //\r
-  // Basic DHCP D.O.R.A.\r
-  // 1, 2, 4, 8, 16 & 32 second timeouts.\r
-  // Callback routine can be used to break out earlier.\r
-  //\r
-  ZeroMem (&zero_ip, sizeof (EFI_IP_ADDRESS));\r
-\r
-  for (timeout = 1;;) {\r
-    //\r
-    // Broadcast DHCP discover and wait for DHCP offers.\r
-    //\r
-    efi_status = PxeDhcp4Init (This, timeout, &offers, &offer_list);\r
-\r
-    if ((efi_status != EFI_SUCCESS) &&\r
-        (efi_status != EFI_TIMEOUT) &&\r
-        (efi_status != EFI_NO_RESPONSE)) {\r
-      return efi_status;\r
-    }\r
-    //\r
-    // Try to select from each DHCP or BOOTP offer.\r
-    //\r
-    for (n = 0; n < offers; ++n) {\r
-      //\r
-      // Ignore proxyDHCP offers.\r
-      //\r
-      if (!CompareMem (&offer_list[n].dhcp4.yiaddr, &zero_ip, 4)) {\r
-        continue;\r
-      }\r
-      //\r
-      // Issue DHCP Request and wait for DHCP Ack/Nak.\r
-      //\r
-      efi_status = PxeDhcp4Select (\r
-                    This,\r
-                    timeout,\r
-                    &offer_list[n]\r
-                    );\r
-\r
-      if (EFI_ERROR (efi_status)) {\r
-        continue;\r
-      }\r
-      //\r
-      // Exit when we have got our DHCP Ack.\r
-      //\r
-      if (This->Data->IsAck) {\r
-        return EFI_SUCCESS;\r
-      }\r
-    }\r
-    //\r
-    // No DHCP Acks.  Release DHCP Offer list storage.\r
-    //\r
-    if (offer_list != NULL) {\r
-      gBS->FreePool (offer_list);\r
-      offer_list = NULL;\r
-    }\r
-    //\r
-    // Try again until we have used up >= DHCP4_MAX_SECONDS.\r
-    //\r
-    if ((timeout <<= 1) > DHCP4_MAX_SECONDS) {\r
-      if (!EFI_ERROR (efi_status)) {\r
-        efi_status = EFI_TIMEOUT;\r
-      }\r
-\r
-      return efi_status;\r
-    }\r
-    //\r
-    // Next timeout value.\r
-    //\r
-    CopyMem (&seconds, &This->Data->Discover.dhcp4.secs, 2);\r
-\r
-    seconds = htons (htons (seconds) + timeout);\r
-\r
-    CopyMem (&This->Data->Discover.dhcp4.secs, &seconds, 2);\r
-  }\r
-}\r
-\r
-/* eof - PxeDhcp4Run.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Setup.c b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/PxeDhcp4Setup.c
deleted file mode 100644 (file)
index 29e4ed0..0000000
+++ /dev/null
@@ -1,258 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  PxeDhcp4Setup.c\r
-\r
-Abstract:\r
-\r
-\r
-**/\r
-\r
-#include "PxeDhcp4.h"\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-EFI_STATUS\r
-EFIAPI\r
-PxeDhcp4Setup (\r
-  IN EFI_PXE_DHCP4_PROTOCOL *This,\r
-  IN EFI_PXE_DHCP4_DATA     *Data\r
-  )\r
-{\r
-  PXE_DHCP4_PRIVATE_DATA  *Private;\r
-  DHCP4_HEADER            *Packet;\r
-  EFI_STATUS              EfiStatus;\r
-  UINT8                   *OpLen;\r
-  UINT8                   *OpPtr;\r
-\r
-  //\r
-  // Return error if parameters are invalid.\r
-  //\r
-  if (This == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Private = PXE_DHCP4_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  if (Private == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (This->Data != NULL) {\r
-    return EFI_ALREADY_STARTED;\r
-  }\r
-\r
-  if (Private->PxeBc == NULL) {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  //\r
-  // Check contents of provided Data structure.\r
-  //\r
-  if (Data != NULL) {\r
-    //\r
-    // Do protocol state checks first.\r
-    //\r
-    if (Data->SelectCompleted) {\r
-      if (!Data->InitCompleted || !Data->SetupCompleted) {\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-\r
-      if (Data->IsBootp && !Data->IsAck) {\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    } else if (Data->InitCompleted) {\r
-      if (!Data->SetupCompleted || Data->IsBootp || Data->IsAck) {\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    } else if (Data->SetupCompleted) {\r
-      if (Data->IsBootp || Data->IsAck) {\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    }\r
-    //\r
-    // Do packet content checks.\r
-    //\r
-    if (Data->SetupCompleted) {\r
-      //\r
-      // %%TBD - check discover packet\r
-      //\r
-    }\r
-\r
-    if (Data->SelectCompleted) {\r
-      if (Data->IsBootp) {\r
-        //\r
-        // %%TBD - check offer packet\r
-        //\r
-        if (CompareMem (\r
-              &Data->Discover,\r
-              &Data->Request,\r
-              sizeof (DHCP4_PACKET)\r
-              )) {\r
-          return EFI_INVALID_PARAMETER;\r
-        }\r
-\r
-        if (CompareMem (\r
-              &Data->Offer,\r
-              &Data->AckNak,\r
-              sizeof (DHCP4_PACKET)\r
-              )) {\r
-          return EFI_INVALID_PARAMETER;\r
-        }\r
-      } else {\r
-        //\r
-        // %%TBD - check offer, request & acknak packets\r
-        //\r
-      }\r
-    }\r
-  }\r
-  //\r
-  // Allocate data structure.  Return error\r
-  // if there is not enough available memory.\r
-  //\r
-  This->Data = AllocatePool (sizeof (EFI_PXE_DHCP4_DATA));\r
-  if (This->Data == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  //\r
-  // Start PxeBc because we want to use its UdpWrite, UdpRead and\r
-  // SetFilter calls.\r
-  //\r
-  EfiStatus = Private->PxeBc->Start (Private->PxeBc, FALSE);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    if (EfiStatus != EFI_ALREADY_STARTED) {\r
-      FreePool (This->Data);\r
-      This->Data = NULL;\r
-      Private->PxeBc->Stop (Private->PxeBc);\r
-      return EfiStatus;\r
-    }\r
-\r
-    Private->StopPxeBc = FALSE;\r
-  } else {\r
-    Private->StopPxeBc = TRUE;\r
-  }\r
-  //\r
-  // Use new data.\r
-  //\r
-  if (Data != NULL) {\r
-    CopyMem (This->Data, Data, sizeof (EFI_PXE_DHCP4_DATA));\r
-    return EFI_SUCCESS;\r
-  }\r
-  //\r
-  // Initialize new public data structure.\r
-  //\r
-  ZeroMem (This->Data, sizeof (EFI_PXE_DHCP4_DATA));\r
-\r
-  //\r
-  // Fill in default DHCP discover packet.\r
-  // Check for MAC addresses of strange lengths, just in case.\r
-  //\r
-  Packet        = &This->Data->Discover.dhcp4;\r
-\r
-  Packet->op    = BOOTP_REQUEST;\r
-\r
-  Packet->htype = Private->Snp->Mode->IfType;\r
-\r
-  if (Private->Snp->Mode->HwAddressSize > 16) {\r
-    Packet->hlen = 16;\r
-  } else {\r
-    Packet->hlen = (UINT8) Private->Snp->Mode->HwAddressSize;\r
-  }\r
-\r
-  Packet->hops = 0; /* Set to zero per RFC 2131. */\r
-\r
-  if (Packet->hlen < sizeof Packet->xid) {\r
-    if (Packet->hlen != 0) {\r
-      CopyMem (\r
-        &Packet->xid,\r
-        &Private->Snp->Mode->CurrentAddress,\r
-        Packet->hlen\r
-        );\r
-    }\r
-  } else {\r
-    CopyMem (\r
-      &Packet->xid,\r
-      &Private->Snp->Mode->CurrentAddress.Addr[Packet->hlen - sizeof Packet->xid],\r
-      sizeof Packet->xid\r
-      );\r
-  }\r
-  //\r
-  // %%TBD - xid should be randomized\r
-  //\r
-  Packet->secs  = htons (DHCP4_INITIAL_SECONDS);\r
-\r
-  Packet->flags = htons (DHCP4_BROADCAST_FLAG);\r
-\r
-  if (Packet->hlen != 0) {\r
-    CopyMem (Packet->chaddr, &Private->Snp->Mode->CurrentAddress, Packet->hlen);\r
-  }\r
-\r
-  Packet->magik               = htonl (DHCP4_MAGIK_NUMBER);\r
-\r
-  OpPtr                       = Packet->options;\r
-\r
-  *OpPtr++                    = DHCP4_MESSAGE_TYPE;\r
-  *OpPtr++                    = 1;\r
-  *OpPtr++                    = DHCP4_MESSAGE_TYPE_DISCOVER;\r
-\r
-  *OpPtr++                    = DHCP4_MAX_MESSAGE_SIZE;\r
-  *OpPtr++                    = 2;\r
-  *OpPtr++                    = (UINT8) ((DHCP4_DEFAULT_MAX_MESSAGE_SIZE >> 8) & 0xFF);\r
-  *OpPtr++                    = (UINT8) (DHCP4_DEFAULT_MAX_MESSAGE_SIZE & 0xFF);\r
-\r
-  *OpPtr++                    = DHCP4_PARAMETER_REQUEST_LIST;\r
-  OpLen                       = OpPtr;\r
-  *OpPtr++                    = 0;\r
-  *OpPtr++                    = DHCP4_SUBNET_MASK;\r
-  *OpPtr++                    = DHCP4_TIME_OFFSET;\r
-  *OpPtr++                    = DHCP4_ROUTER_LIST;\r
-  *OpPtr++                    = DHCP4_TIME_SERVERS;\r
-  *OpPtr++                    = DHCP4_NAME_SERVERS;\r
-  *OpPtr++                    = DHCP4_DNS_SERVERS;\r
-  *OpPtr++                    = DHCP4_HOST_NAME;\r
-  *OpPtr++                    = DHCP4_BOOT_FILE_SIZE;\r
-  *OpPtr++                    = DHCP4_MESSAGE_TYPE;\r
-  *OpPtr++                    = DHCP4_DOMAIN_NAME;\r
-  *OpPtr++                    = DHCP4_ROOT_PATH;\r
-  *OpPtr++                    = DHCP4_EXTENSION_PATH;\r
-  *OpPtr++                    = DHCP4_MAX_DATAGRAM_SIZE;\r
-  *OpPtr++                    = DHCP4_DEFAULT_TTL;\r
-  *OpPtr++                    = DHCP4_BROADCAST_ADDRESS;\r
-  *OpPtr++                    = DHCP4_NIS_DOMAIN_NAME;\r
-  *OpPtr++                    = DHCP4_NIS_SERVERS;\r
-  *OpPtr++                    = DHCP4_NTP_SERVERS;\r
-  *OpPtr++                    = DHCP4_VENDOR_SPECIFIC;\r
-  *OpPtr++                    = DHCP4_REQUESTED_IP_ADDRESS;\r
-  *OpPtr++                    = DHCP4_LEASE_TIME;\r
-  *OpPtr++                    = DHCP4_SERVER_IDENTIFIER;\r
-  *OpPtr++                    = DHCP4_RENEWAL_TIME;\r
-  *OpPtr++                    = DHCP4_REBINDING_TIME;\r
-  *OpPtr++                    = DHCP4_CLASS_IDENTIFIER;\r
-  *OpPtr++                    = DHCP4_TFTP_SERVER_NAME;\r
-  *OpPtr++                    = DHCP4_BOOTFILE;\r
-  *OpPtr++                    = 128;\r
-  *OpPtr++                    = 129;\r
-  *OpPtr++                    = 130;\r
-  *OpPtr++                    = 131;\r
-  *OpPtr++                    = 132;\r
-  *OpPtr++                    = 133;\r
-  *OpPtr++                    = 134;\r
-  *OpPtr++                    = 135;\r
-  *OpLen                      = (UINT8) ((OpPtr - OpLen) - 1);\r
-\r
-  *OpPtr++                    = DHCP4_END;\r
-\r
-  This->Data->SetupCompleted  = TRUE;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/* eof - PxeDhcp4Setup.c */\r
diff --git a/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/Support.c b/MdeModulePkg/Universal/Network/PxeDhcp4Dxe/Support.c
deleted file mode 100644 (file)
index 1406cbb..0000000
+++ /dev/null
@@ -1,1061 +0,0 @@
-/** @file\r
-\r
-Copyright (c) 2004 - 2005, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  support.c\r
-\r
-Abstract:\r
-  Miscellaneous support routines for PxeDhcp4 protocol.\r
-\r
-\r
-**/\r
-\r
-\r
-#include "PxeDhcp4.h"\r
-\r
-#define DebugPrint(x)\r
-//\r
-// #define DebugPrint(x) Aprint x\r
-//\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-UINT16\r
-htons (\r
-  UINTN n\r
-  )\r
-{\r
-  return (UINT16) ((n >> 8) | (n << 8));\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-UINT32\r
-htonl (\r
-  UINTN n\r
-  )\r
-{\r
-  return (UINT32) ((n >> 24) | ((n >> 8) & 0xFF00) | ((n & 0xFF00) << 8) | (n << 24));\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-EFIAPI\r
-timeout_notify (\r
-  IN EFI_EVENT Event,\r
-  IN VOID      *Context\r
-  )\r
-{\r
-  ASSERT (Context);\r
-\r
-  if (Context != NULL) {\r
-    ((PXE_DHCP4_PRIVATE_DATA *) Context)->TimeoutOccurred = TRUE;\r
-  }\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-EFIAPI\r
-periodic_notify (\r
-  IN EFI_EVENT Event,\r
-  IN VOID      *Context\r
-  )\r
-{\r
-  ASSERT (Context);\r
-\r
-  if (Context != NULL) {\r
-    ((PXE_DHCP4_PRIVATE_DATA *) Context)->PeriodicOccurred = TRUE;\r
-  }\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return EFI_SUCCESS := Option was found\r
-  @return EFI_INVALID_PARAMETER := Packet == NULL || OpPtr == NULL\r
-  @return EFI_INVALID_PARAMETER := OpCode == DHCP4_PAD\r
-  @return EFI_INVALID_PARAMETER := OpCode == DHCP4_END && Skip != 0\r
-  @return EFI_INVALID_PARAMETER := DHCP magik number in Packet is not valid\r
-  @return EFI_NOT_FOUND := op-code was not found in packet\r
-  @return EFI_INVALID_PARAMETER := If present, DHCP_MAX_MESSAGE_SIZE option\r
-  @return does not have a valid value.\r
-\r
-**/\r
-EFI_STATUS\r
-find_opt (\r
-  IN DHCP4_PACKET *Packet,\r
-  IN UINT8        OpCode,\r
-  IN UINTN        Skip,\r
-  OUT DHCP4_OP    **OpPtr\r
-  )\r
-{\r
-  UINTN msg_size;\r
-  UINTN buf_len;\r
-  UINTN n;\r
-  UINT8 *buf;\r
-  UINT8 *end_ptr;\r
-  UINT8 overload;\r
-\r
-  //\r
-  // Verify parameters.\r
-  //\r
-  if (Packet == NULL || OpPtr == NULL || OpCode == DHCP4_PAD || (OpCode == DHCP4_END && Skip != 0)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Packet->dhcp4.magik != htonl (DHCP4_MAGIK_NUMBER)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Initialize search variables.\r
-  //\r
-  *OpPtr    = NULL;\r
-\r
-  msg_size  = DHCP4_MAX_PACKET_SIZE - (DHCP4_UDP_HEADER_SIZE + DHCP4_IP_HEADER_SIZE);\r
-\r
-  overload  = 0;\r
-  end_ptr   = NULL;\r
-\r
-  buf       = Packet->dhcp4.options;\r
-  buf_len   = msg_size - (Packet->dhcp4.options - Packet->raw);\r
-\r
-  //\r
-  // Start searching for requested option.\r
-  //\r
-  for (n = 0;;) {\r
-    //\r
-    // If match is found, decrement skip count and return\r
-    // when desired match is found.\r
-    //\r
-    if (buf[n] == OpCode) {\r
-      *OpPtr = (DHCP4_OP *) &buf[n];\r
-\r
-      if (Skip-- == 0) {\r
-        return EFI_SUCCESS;\r
-      }\r
-    }\r
-    //\r
-    // Skip past current option.  Check for option overload\r
-    // and message size options since these will affect the\r
-    // amount of data to be searched.\r
-    //\r
-    switch (buf[n]) {\r
-    case DHCP4_PAD:\r
-      //\r
-      // Remember the first pad byte of a group.  This\r
-      // could be the end of a badly formed packet.\r
-      //\r
-      if (end_ptr == NULL) {\r
-        end_ptr = &buf[n];\r
-      }\r
-\r
-      ++n;\r
-      break;\r
-\r
-    case DHCP4_END:\r
-      //\r
-      // If we reach the end we are done.\r
-      //\r
-      end_ptr = NULL;\r
-      return EFI_NOT_FOUND;\r
-\r
-    case DHCP4_OPTION_OVERLOAD:\r
-      //\r
-      // Remember the option overload value since it\r
-      // could cause the search to continue into\r
-      // the fname and sname fields.\r
-      //\r
-      end_ptr = NULL;\r
-\r
-      if (buf[n + 1] == 1) {\r
-        overload = buf[n + 2];\r
-      }\r
-\r
-      n += 2 + buf[n + 1];\r
-      break;\r
-\r
-    case DHCP4_MAX_MESSAGE_SIZE:\r
-      //\r
-      // Remember the message size value since it could\r
-      // change the amount of option buffer to search.\r
-      //\r
-      end_ptr = NULL;\r
-\r
-      if (buf[n + 1] == 2 && buf == Packet->dhcp4.options) {\r
-        msg_size = ((buf[n + 2] << 8) | buf[n + 3]) - (DHCP4_UDP_HEADER_SIZE + DHCP4_IP_HEADER_SIZE);\r
-\r
-        if (msg_size < 328) {\r
-          return EFI_INVALID_PARAMETER;\r
-        }\r
-\r
-        buf_len = msg_size - (Packet->dhcp4.options - Packet->raw);\r
-\r
-        if (n + 2 + buf[n + 1] > buf_len) {\r
-          return EFI_INVALID_PARAMETER;\r
-        }\r
-      }\r
-\r
-    /* fall thru */\r
-    default:\r
-      end_ptr = NULL;\r
-\r
-      n += 2 + buf[n + 1];\r
-    }\r
-    //\r
-    // Keep searching until the end of the buffer is reached.\r
-    //\r
-    if (n < buf_len) {\r
-      continue;\r
-    }\r
-    //\r
-    // Reached end of current buffer.  Check if we are supposed\r
-    // to search the fname and sname buffers.\r
-    //\r
-    if (buf == Packet->dhcp4.options &&\r
-        (overload == DHCP4_OVERLOAD_FNAME || overload == DHCP4_OVERLOAD_FNAME_AND_SNAME)\r
-        ) {\r
-      buf     = Packet->dhcp4.fname;\r
-      buf_len = 128;\r
-      n       = 0;\r
-      continue;\r
-    }\r
-\r
-    if (buf != Packet->dhcp4.sname && (overload == DHCP4_OVERLOAD_SNAME || overload == DHCP4_OVERLOAD_FNAME_AND_SNAME)) {\r
-      buf     = Packet->dhcp4.sname;\r
-      buf_len = 64;\r
-      n       = 0;\r
-      continue;\r
-    }\r
-    //\r
-    // End of last buffer reached.  If this was a search\r
-    // for the end of the options, go back to the start\r
-    // of the current pad block.\r
-    //\r
-    if (OpCode == DHCP4_END && end_ptr != NULL) {\r
-      *OpPtr = (DHCP4_OP *) end_ptr;\r
-      return EFI_SUCCESS;\r
-    }\r
-\r
-    return EFI_NOT_FOUND;\r
-  }\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return EFI_INVALID_PARAMETER := Packet == NULL || OpPtr == NULL\r
-  @return EFI_INVALID_PARAMETER := OpPtr->op == DHCP4_PAD || OpPtr->op == DHCP4_END\r
-  @return EFI_INVALID_PARAMETER := DHCP magik number in DHCP packet is not valid\r
-  @return EFI_INVALID_PARAMETER := If DHCP_MAX_MESSAGE_SIZE option is present and\r
-  @return is not valid\r
-  @return EFI_INVALID_PARAMETER := If DHCP_OPTION_OVERLOAD option is present and\r
-  @return is not valid\r
-  @return EFI_DEVICE_ERROR := Cannot determine end of packet\r
-  @return EFI_BUFFER_TOO_SMALL := Not enough room in packet to add option\r
-  @return EFI_SUCCESS := Option added to DHCP packet\r
-\r
-**/\r
-EFI_STATUS\r
-add_opt (\r
-  IN DHCP4_PACKET *Packet,\r
-  IN DHCP4_OP     *OpPtr\r
-  )\r
-{\r
-  EFI_STATUS  efi_status;\r
-  DHCP4_OP    *msg_size_op;\r
-  DHCP4_OP    *overload_op;\r
-  DHCP4_OP    *op;\r
-  UINTN       msg_size;\r
-  UINTN       buf_len;\r
-  UINT32      magik;\r
-  UINT8       *buf;\r
-\r
-  //\r
-  // Verify parameters.\r
-  //\r
-  ASSERT (Packet);\r
-  ASSERT (OpPtr);\r
-\r
-  if (Packet == NULL || OpPtr == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  switch (OpPtr->op) {\r
-  case DHCP4_PAD:\r
-  case DHCP4_END:\r
-    //\r
-    // No adding PAD or END.\r
-    //\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Check the DHCP magik number.\r
-  //\r
-  CopyMem (&magik, &Packet->dhcp4.magik, 4);\r
-\r
-  if (magik != htonl (DHCP4_MAGIK_NUMBER)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Find the DHCP message size option.\r
-  //\r
-  msg_size = DHCP4_DEFAULT_MAX_MESSAGE_SIZE;\r
-\r
-  efi_status = find_opt (\r
-                Packet,\r
-                DHCP4_MAX_MESSAGE_SIZE,\r
-                0,\r
-                &msg_size_op\r
-                );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    if (efi_status != EFI_NOT_FOUND) {\r
-      DebugPrint (\r
-        ("%s:%d:%r\n",\r
-        __FILE__,\r
-        __LINE__,\r
-        efi_status)\r
-        );\r
-      return efi_status;\r
-    }\r
-\r
-    msg_size_op = NULL;\r
-  } else {\r
-    CopyMem (&msg_size, msg_size_op->data, 2);\r
-    msg_size = htons (msg_size);\r
-\r
-    if (msg_size < DHCP4_DEFAULT_MAX_MESSAGE_SIZE) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-  }\r
-  //\r
-  // Find the DHCP option overload option.\r
-  //\r
-  efi_status = find_opt (\r
-                Packet,\r
-                DHCP4_OPTION_OVERLOAD,\r
-                0,\r
-                &overload_op\r
-                );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    if (efi_status != EFI_NOT_FOUND) {\r
-      DebugPrint (\r
-        ("%s:%d:%r\n",\r
-        __FILE__,\r
-        __LINE__,\r
-        efi_status)\r
-        );\r
-      return efi_status;\r
-    }\r
-\r
-    overload_op = NULL;\r
-  } else {\r
-    if (overload_op->len != 1) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    switch (overload_op->data[0]) {\r
-    case 1:\r
-    case 2:\r
-    case 3:\r
-      break;\r
-\r
-    default:\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-  }\r
-  //\r
-  // Find the end of the packet.\r
-  //\r
-  efi_status = find_opt (Packet, DHCP4_END, 0, &op);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Find which buffer the end is in.\r
-  //\r
-  if ((UINTN) op >= (UINTN) (buf = Packet->dhcp4.options)) {\r
-    buf_len = (msg_size - ((UINT8 *) &Packet->dhcp4.options - (UINT8 *) &Packet->raw)) - (DHCP4_UDP_HEADER_SIZE + DHCP4_IP_HEADER_SIZE);\r
-  } else if ((UINTN) op >= (UINTN) (buf = Packet->dhcp4.fname)) {\r
-    buf_len = 128;\r
-  } else if ((UINTN) op >= (UINTN) (buf = Packet->dhcp4.sname)) {\r
-    buf_len = 64;\r
-  } else {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  //\r
-  // Add option to current buffer if there is no overlow.\r
-  //\r
-  if ((UINTN) ((&op->op - buf) + 3 + op->len) < buf_len) {\r
-    CopyMem (op, OpPtr, OpPtr->len + 2);\r
-\r
-    op->data[op->len] = DHCP4_END;\r
-\r
-    return EFI_SUCCESS;\r
-  }\r
-  //\r
-  // Error if there is no space for option.\r
-  //\r
-  return EFI_BUFFER_TOO_SMALL;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return EFI_INVALID_PARAMETER := Private == NULL || Private->PxeBc == NULL\r
-  @return EFI_INVALID_PARAMETER := Only one of StationIp and SubnetMask is given\r
-  @return EFI_SUCCESS := UDP stack is ready\r
-  @return other := Error from PxeBc->SetIpFilter() or PxeBc->SetStationIp()\r
-\r
-**/\r
-EFI_STATUS\r
-start_udp (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  IN OPTIONAL EFI_IP_ADDRESS         *StationIp,\r
-  IN OPTIONAL EFI_IP_ADDRESS         *SubnetMask\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_IP_FILTER bcast_filter;\r
-  EFI_STATUS                  efi_status;\r
-\r
-  //\r
-  //\r
-  //\r
-  ASSERT (Private);\r
-  ASSERT (Private->PxeBc);\r
-\r
-  if (Private == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Private->PxeBc == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (StationIp != NULL && SubnetMask == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (StationIp == NULL && SubnetMask != NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Setup broadcast receive filter...\r
-  //\r
-  ZeroMem (&bcast_filter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));\r
-\r
-  bcast_filter.Filters  = EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST;\r
-  bcast_filter.IpCnt    = 0;\r
-\r
-  efi_status = Private->PxeBc->SetIpFilter (\r
-                                Private->PxeBc,\r
-                                &bcast_filter\r
-                                );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    DebugPrint (("%s:%d:%r\n", __FILE__, __LINE__, efi_status));\r
-    return efi_status;\r
-  }\r
-  //\r
-  // Configure station IP address and subnet mask...\r
-  //\r
-  efi_status = Private->PxeBc->SetStationIp (\r
-                                Private->PxeBc,\r
-                                StationIp,\r
-                                SubnetMask\r
-                                );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    DebugPrint (("%s:%d:%r\n", __FILE__, __LINE__, efi_status));\r
-  }\r
-\r
-  return efi_status;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-stop_udp (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private\r
-  )\r
-{\r
-  //\r
-  //\r
-  //\r
-  ASSERT (Private);\r
-  ASSERT (Private->PxeBc);\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-\r
-**/\r
-EFI_STATUS\r
-start_receive_events (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  IN UINTN                  SecondsTimeout\r
-  )\r
-{\r
-  EFI_STATUS  efi_status;\r
-  UINTN       random;\r
-\r
-  //\r
-  //\r
-  //\r
-  ASSERT (Private);\r
-  ASSERT (SecondsTimeout);\r
-\r
-  if (Private == NULL || SecondsTimeout == 0) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Need a bettern randomizer...\r
-  // For now adjust the timeout value by the least significant\r
-  // digit in the MAC address.\r
-  //\r
-  random = 0;\r
-\r
-  if (Private->PxeDhcp4.Data != NULL) {\r
-    if (Private->PxeDhcp4.Data->Discover.dhcp4.hlen != 0 && Private->PxeDhcp4.Data->Discover.dhcp4.hlen <= 16) {\r
-      random = 0xFFF & Private->PxeDhcp4.Data->Discover.dhcp4.chaddr[Private->PxeDhcp4.Data->Discover.dhcp4.hlen - 1];\r
-    }\r
-  }\r
-  //\r
-  // Setup timeout event and start timer.\r
-  //\r
-  efi_status = gBS->CreateEvent (\r
-                      EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
-                      TPL_NOTIFY,\r
-                      &timeout_notify,\r
-                      Private,\r
-                      &Private->TimeoutEvent\r
-                      );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    DebugPrint (("%s:%d:%r\n", __FILE__, __LINE__, efi_status));\r
-    return efi_status;\r
-  }\r
-\r
-  efi_status = gBS->SetTimer (\r
-                      Private->TimeoutEvent,\r
-                      TimerRelative,\r
-                      SecondsTimeout * 10000000 + random\r
-                      );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    DebugPrint (("%s:%d:%r\n", __FILE__, __LINE__, efi_status));\r
-    gBS->CloseEvent (Private->TimeoutEvent);\r
-    return efi_status;\r
-  }\r
-\r
-  Private->TimeoutOccurred = FALSE;\r
-\r
-  //\r
-  // Setup periodic event for callbacks\r
-  //\r
-  efi_status = gBS->CreateEvent (\r
-                      EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
-                      TPL_NOTIFY,\r
-                      &periodic_notify,\r
-                      Private,\r
-                      &Private->PeriodicEvent\r
-                      );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    DebugPrint (("%s:%d:%r\n", __FILE__, __LINE__, efi_status));\r
-    gBS->CloseEvent (Private->TimeoutEvent);\r
-    return efi_status;\r
-  }\r
-\r
-  efi_status = gBS->SetTimer (\r
-                      Private->PeriodicEvent,\r
-                      TimerPeriodic,\r
-                      1000000\r
-                      );  /* 1/10th second */\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    DebugPrint (("%s:%d:%r\n", __FILE__, __LINE__, efi_status));\r
-    gBS->CloseEvent (Private->TimeoutEvent);\r
-    gBS->CloseEvent (Private->PeriodicEvent);\r
-    return efi_status;\r
-  }\r
-\r
-  Private->PeriodicOccurred = FALSE;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-VOID\r
-stop_receive_events (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private\r
-  )\r
-{\r
-  //\r
-  //\r
-  //\r
-  ASSERT (Private);\r
-\r
-  if (Private == NULL) {\r
-    return ;\r
-  }\r
-  //\r
-  //\r
-  //\r
-  gBS->CloseEvent (Private->TimeoutEvent);\r
-  Private->TimeoutOccurred = FALSE;\r
-\r
-  //\r
-  //\r
-  //\r
-  gBS->CloseEvent (Private->PeriodicEvent);\r
-  Private->PeriodicOccurred = FALSE;\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return EFI_INVALID_PARAMETER := Private == NULL || dest_ip == NULL ||\r
-  @return buffer == NULL || BufferSize < 300 || Private->PxeBc == NULL\r
-  @return EFI_SUCCESS := Buffer was transmitted\r
-  @return other := Return from PxeBc->UdpWrite()\r
-\r
-**/\r
-EFI_STATUS\r
-tx_udp (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  IN EFI_IP_ADDRESS         *dest_ip,\r
-  IN OPTIONAL EFI_IP_ADDRESS         *gateway_ip,\r
-  IN EFI_IP_ADDRESS         *src_ip,\r
-  IN VOID                   *buffer,\r
-  IN UINTN                  BufferSize\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_UDP_PORT  dest_port;\r
-  EFI_PXE_BASE_CODE_UDP_PORT  src_port;\r
-  EFI_IP_ADDRESS              zero_ip;\r
-\r
-  //\r
-  //\r
-  //\r
-  ASSERT (Private);\r
-  ASSERT (dest_ip);\r
-  ASSERT (buffer);\r
-  ASSERT (BufferSize >= 300);\r
-\r
-  if (Private == NULL || dest_ip == NULL || buffer == NULL || BufferSize < 300) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  ASSERT (Private->PxeBc);\r
-\r
-  if (Private->PxeBc == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Transmit DHCP discover packet...\r
-  //\r
-  ZeroMem (&zero_ip, sizeof (EFI_IP_ADDRESS));\r
-\r
-  if (src_ip == NULL) {\r
-    src_ip = &zero_ip;\r
-  }\r
-\r
-  dest_port = DHCP4_SERVER_PORT;\r
-  src_port  = DHCP4_CLIENT_PORT;\r
-\r
-  return Private->PxeBc->UdpWrite (\r
-                          Private->PxeBc,\r
-                          EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT,\r
-                          dest_ip,\r
-                          &dest_port,\r
-                          gateway_ip,\r
-                          src_ip,\r
-                          &src_port,\r
-                          NULL,\r
-                          NULL,\r
-                          &BufferSize,\r
-                          buffer\r
-                          );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-\r
-/**\r
-\r
-  @return EFI_INVALID_PARAMETER :=\r
-  @return EFI_SUCCESS := Packet received\r
-  @return other := Return from PxeBc->UdpRead()\r
-\r
-**/\r
-EFI_STATUS\r
-rx_udp (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  OUT VOID                  *buffer,\r
-  IN OUT UINTN              *BufferSize,\r
-  IN OUT EFI_IP_ADDRESS     *dest_ip,\r
-  IN OUT EFI_IP_ADDRESS     *src_ip,\r
-  IN UINT16                 op_flags\r
-  )\r
-{\r
-  EFI_PXE_BASE_CODE_UDP_PORT  dest_port;\r
-  EFI_PXE_BASE_CODE_UDP_PORT  src_port;\r
-\r
-  //\r
-  //\r
-  //\r
-  ASSERT (Private);\r
-  ASSERT (buffer);\r
-  ASSERT (dest_ip);\r
-  ASSERT (src_ip);\r
-\r
-  if (Private == NULL || buffer == NULL || dest_ip == NULL || src_ip == NULL || BufferSize == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  ASSERT (Private->PxeBc);\r
-\r
-  if (Private->PxeBc == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Check for packet\r
-  //\r
-  *BufferSize = sizeof (DHCP4_PACKET);\r
-\r
-  dest_port   = DHCP4_CLIENT_PORT;\r
-  src_port    = DHCP4_SERVER_PORT;\r
-\r
-  return Private->PxeBc->UdpRead (\r
-                          Private->PxeBc,\r
-                          op_flags,\r
-                          dest_ip,\r
-                          &dest_port,\r
-                          src_ip,\r
-                          &src_port,\r
-                          NULL,\r
-                          NULL,\r
-                          BufferSize,\r
-                          buffer\r
-                          );\r
-}\r
-\r
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
-EFI_STATUS\r
-tx_rx_udp (\r
-  IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-  IN OUT EFI_IP_ADDRESS     *ServerIp,\r
-  IN OPTIONAL EFI_IP_ADDRESS         *gateway_ip,\r
-  IN OPTIONAL EFI_IP_ADDRESS         *client_ip,\r
-  IN OPTIONAL EFI_IP_ADDRESS         *SubnetMask,\r
-  IN DHCP4_PACKET           *tx_pkt,\r
-  OUT DHCP4_PACKET          *rx_pkt,\r
-  IN INTN (*rx_vfy)(\r
-      IN PXE_DHCP4_PRIVATE_DATA *Private,\r
-      IN DHCP4_PACKET *tx_pkt,\r
-      IN DHCP4_PACKET *rx_pkt,\r
-      IN UINTN rx_pkt_size\r
-    ),\r
-  IN UINTN SecondsTimeout\r
-  )\r
-/*++\r
-Routine description:\r
-  Transmit DHCP packet and wait for replies.\r
-\r
-Parameters:\r
-  Private := Pointer to PxeDhcp4 private data\r
-  ServerIp := Pointer to server IP address\r
-  gateway_ip := Pointer to gateway IP address or NULL\r
-  client_ip := Pointer to client IP address or NULL\r
-  SubnetMask := Pointer to subnet mask or NULL\r
-  tx_pkt := Pointer to DHCP packet to transmit\r
-  rx_pkt := Pointer to DHCP packet receive buffer\r
-  rx_vfy := Pointer to DHCP packet receive verification routine\r
-  SecondsTimeout := Number of seconds until timeout\r
-\r
-Returns:\r
-  EFI_INVALID_PARAMETER := Private == NULL || ServerIp == NULL ||\r
-    tx_pkt == NULL || rx_pkt == NULL || rx_vfy == NULL || Private->PxeBc == NULL\r
-  EFI_ABORTED := Receive aborted\r
-  EFI_TIMEOUT := No packets received\r
-  EFI_SUCCESS := Packet(s) received\r
-  other := Returns from other PxeDhcp4 support routines\r
---*/\r
-{\r
-  EFI_PXE_DHCP4_CALLBACK_STATUS CallbackStatus;\r
-  EFI_IP_ADDRESS                dest_ip;\r
-  EFI_IP_ADDRESS                src_ip;\r
-  EFI_STATUS                    efi_status;\r
-  DHCP4_OP                      *msg_size_op;\r
-  UINTN                         pkt_size;\r
-  UINTN                         n;\r
-  UINT16                        msg_size;\r
-  UINT16                        op_flags;\r
-  BOOLEAN                       done_flag;\r
-  BOOLEAN                       got_packet;\r
-\r
-  //\r
-  // Bad programmer check...\r
-  //\r
-  ASSERT (Private);\r
-  ASSERT (ServerIp);\r
-  ASSERT (tx_pkt);\r
-  ASSERT (rx_pkt);\r
-  ASSERT (rx_vfy);\r
-\r
-  if (Private == NULL || ServerIp == NULL || tx_pkt == NULL || rx_pkt == NULL || rx_vfy == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  ASSERT (Private->PxeBc);\r
-\r
-  if (Private->PxeBc == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Enable UDP...\r
-  //\r
-  efi_status = start_udp (Private, client_ip, SubnetMask);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    DebugPrint (("%s:%d:%r\n", __FILE__, __LINE__, efi_status));\r
-    return efi_status;\r
-  }\r
-  //\r
-  // Get length of transmit packet...\r
-  //\r
-  msg_size = DHCP4_DEFAULT_MAX_MESSAGE_SIZE;\r
-\r
-  efi_status = find_opt (\r
-                tx_pkt,\r
-                DHCP4_MAX_MESSAGE_SIZE,\r
-                0,\r
-                &msg_size_op\r
-                );\r
-\r
-  if (!EFI_ERROR (efi_status)) {\r
-    CopyMem (&msg_size, msg_size_op->data, 2);\r
-\r
-    if ((msg_size = htons (msg_size)) < 328) {\r
-      msg_size = 328;\r
-    }\r
-  }\r
-  //\r
-  // Transmit packet...\r
-  //\r
-  efi_status = tx_udp (\r
-                Private,\r
-                ServerIp,\r
-                gateway_ip,\r
-                client_ip,\r
-                tx_pkt,\r
-                msg_size - (DHCP4_UDP_HEADER_SIZE + DHCP4_IP_HEADER_SIZE)\r
-                );\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    DebugPrint (("%s:%d:%r\n", __FILE__, __LINE__, efi_status));\r
-    stop_udp (Private);\r
-    return efi_status;\r
-  }\r
-  //\r
-  // Enable periodic and timeout events...\r
-  //\r
-  efi_status = start_receive_events (Private, SecondsTimeout);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    DebugPrint (("%s:%d:%r\n", __FILE__, __LINE__, efi_status));\r
-    stop_udp (Private);\r
-    return efi_status;\r
-  }\r
-  //\r
-  // Wait for packet(s)...\r
-  //\r
-\r
-  done_flag   = FALSE;\r
-  got_packet  = FALSE;\r
-\r
-  while (!done_flag) {\r
-    //\r
-    // Check for timeout event...\r
-    //\r
-    if (Private->TimeoutOccurred) {\r
-      efi_status = EFI_SUCCESS;\r
-      break;\r
-    }\r
-    //\r
-    // Check for periodic event...\r
-    //\r
-    if (Private->PeriodicOccurred && Private->callback != NULL) {\r
-      CallbackStatus = EFI_PXE_DHCP4_CALLBACK_STATUS_CONTINUE;\r
-\r
-      if (Private->callback->Callback != NULL) {\r
-        CallbackStatus = (Private->callback->Callback) (&Private->PxeDhcp4, Private->function, 0, NULL);\r
-      }\r
-\r
-      switch (CallbackStatus) {\r
-      case EFI_PXE_DHCP4_CALLBACK_STATUS_CONTINUE:\r
-        break;\r
-\r
-      case EFI_PXE_DHCP4_CALLBACK_STATUS_ABORT:\r
-      default:\r
-        stop_receive_events (Private);\r
-        stop_udp (Private);\r
-        return EFI_ABORTED;\r
-      }\r
-\r
-      Private->PeriodicOccurred = FALSE;\r
-    }\r
-    //\r
-    // Check for packet...\r
-    //\r
-    if (client_ip == NULL) {\r
-      SetMem (&dest_ip, sizeof (EFI_IP_ADDRESS), 0xFF);\r
-    } else {\r
-      CopyMem (&dest_ip, client_ip, sizeof (EFI_IP_ADDRESS));\r
-    }\r
-\r
-    SetMem (&src_ip, sizeof (EFI_IP_ADDRESS), 0xFF);\r
-\r
-    if (CompareMem (&src_ip, &ServerIp, sizeof (EFI_IP_ADDRESS))) {\r
-      ZeroMem (&src_ip, sizeof (EFI_IP_ADDRESS));\r
-      op_flags = EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP;\r
-    } else {\r
-      op_flags = 0;\r
-    }\r
-\r
-    efi_status = rx_udp (\r
-                  Private,\r
-                  rx_pkt,\r
-                  &pkt_size,\r
-                  &dest_ip,\r
-                  &src_ip,\r
-                  op_flags\r
-                  );\r
-\r
-    if (efi_status == EFI_TIMEOUT) {\r
-      efi_status = EFI_SUCCESS;\r
-      continue;\r
-    }\r
-\r
-    if (EFI_ERROR (efi_status)) {\r
-      break;\r
-    }\r
-    //\r
-    // Some basic packet sanity checks..\r
-    //\r
-    if (pkt_size < 300) {\r
-      continue;\r
-    }\r
-\r
-    if (rx_pkt->dhcp4.op != BOOTP_REPLY) {\r
-      continue;\r
-    }\r
-\r
-    if (tx_pkt->dhcp4.htype != rx_pkt->dhcp4.htype) {\r
-      continue;\r
-    }\r
-\r
-    if ((n = tx_pkt->dhcp4.hlen) != rx_pkt->dhcp4.hlen) {\r
-      continue;\r
-    }\r
-\r
-    if (CompareMem (&tx_pkt->dhcp4.xid, &rx_pkt->dhcp4.xid, 4)) {\r
-      continue;\r
-    }\r
-\r
-    if (n != 0) {\r
-      if (n >= 16) {\r
-        n = 16;\r
-      }\r
-\r
-      if (CompareMem (tx_pkt->dhcp4.chaddr, rx_pkt->dhcp4.chaddr, n)) {\r
-        continue;\r
-      }\r
-    }\r
-    //\r
-    // Internal callback packet verification...\r
-    //\r
-    switch ((*rx_vfy) (Private, tx_pkt, rx_pkt, pkt_size)) {\r
-    case -2:  /* ignore and stop */\r
-      stop_receive_events (Private);\r
-      stop_udp (Private);\r
-      return EFI_ABORTED;\r
-\r
-    case -1:  /* ignore and wait */\r
-      continue;\r
-\r
-    case 0:   /* accept and wait */\r
-      break;\r
-\r
-    case 1:   /* accept and stop */\r
-      done_flag = TRUE;\r
-      break;\r
-\r
-    default:\r
-      ASSERT (0);\r
-    }\r
-    //\r
-    // External callback packet verification...\r
-    //\r
-    CallbackStatus = EFI_PXE_DHCP4_CALLBACK_STATUS_KEEP_CONTINUE;\r
-\r
-    if (Private->callback != NULL) {\r
-      if (Private->callback->Callback != NULL) {\r
-        CallbackStatus = (Private->callback->Callback) (&Private->PxeDhcp4, Private->function, (UINT32) pkt_size, rx_pkt);\r
-      }\r
-    }\r
-\r
-    switch (CallbackStatus) {\r
-    case EFI_PXE_DHCP4_CALLBACK_STATUS_IGNORE_CONTINUE:\r
-      continue;\r
-\r
-    case EFI_PXE_DHCP4_CALLBACK_STATUS_KEEP_ABORT:\r
-      done_flag = TRUE;\r
-      break;\r
-\r
-    case EFI_PXE_DHCP4_CALLBACK_STATUS_IGNORE_ABORT:\r
-      stop_receive_events (Private);\r
-      stop_udp (Private);\r
-      return EFI_ABORTED;\r
-\r
-    case EFI_PXE_DHCP4_CALLBACK_STATUS_KEEP_CONTINUE:\r
-    default:\r
-      break;\r
-    }\r
-    //\r
-    // We did!  We did get a packet!\r
-    //\r
-    got_packet = TRUE;\r
-  }\r
-  //\r
-  //\r
-  //\r
-  stop_receive_events (Private);\r
-  stop_udp (Private);\r
-\r
-  if (EFI_ERROR (efi_status)) {\r
-    DebugPrint (("%s:%d:%r\n", __FILE__, __LINE__, efi_status));\r
-    return efi_status;\r
-  }\r
-\r
-  if (got_packet) {\r
-    return EFI_SUCCESS;\r
-  } else {\r
-    return EFI_TIMEOUT;\r
-  }\r
-}\r
-\r
-/* eof - support.c */\r