1 /** @file 2 3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> 4 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include <Uefi.h> 16 #include <Library/BaseMemoryLib.h> 17 #include <Library/DebugLib.h> 18 #include <Library/UefiRuntimeServicesTableLib.h> 19 #include <Library/UefiBootServicesTableLib.h> 20 21 #include <Protocol/SimpleNetwork.h> 22 #include <Protocol/PxeBaseCode.h> 23 24 25 BOOLEAN gUseIpv6 = FALSE; 26 27 EFI_STATUS 28 EFIAPI 29 EblGetCurrentIpAddress ( 30 IN OUT EFI_IP_ADDRESS *Ip 31 ) 32 { 33 EFI_STATUS Status; 34 EFI_PXE_BASE_CODE_PROTOCOL *Pxe; 35 36 Status = gBS->LocateProtocol (&gEfiPxeBaseCodeProtocolGuid, NULL, (VOID **)&Pxe); 37 if (EFI_ERROR(Status)) { 38 return Status; 39 } 40 41 Status = Pxe->Start (Pxe, gUseIpv6); 42 if (EFI_ERROR(Status) && (Status != EFI_ALREADY_STARTED)) { 43 return Status; 44 } 45 46 CopyMem (Ip, &Pxe->Mode->StationIp, sizeof (EFI_IP_ADDRESS)); 47 48 return EFI_SUCCESS; 49 } 50 51 52 EFI_STATUS 53 EFIAPI 54 EblGetCurrentMacAddress ( 55 IN OUT EFI_MAC_ADDRESS *Mac 56 ) 57 { 58 EFI_STATUS Status; 59 EFI_SIMPLE_NETWORK_PROTOCOL *SimpleNet; 60 61 Status = gBS->LocateProtocol (&gEfiSimpleNetworkProtocolGuid, NULL, (VOID **)&SimpleNet); 62 if (EFI_ERROR(Status)) { 63 return Status; 64 } 65 66 CopyMem (Mac, SimpleNet->Mode->CurrentAddress.Addr, sizeof (EFI_MAC_ADDRESS)); 67 return Status; 68 } 69 70 71 CHAR8 * 72 EFIAPI 73 EblLoadFileBootTypeString ( 74 IN EFI_HANDLE Handle 75 ) 76 { 77 EFI_STATUS Status; 78 VOID *NullPtr; 79 80 Status = gBS->HandleProtocol (Handle, &gEfiPxeBaseCodeProtocolGuid, &NullPtr); 81 if (!EFI_ERROR (Status)) { 82 return "EFI PXE Network Boot"; 83 } 84 85 return ""; 86 } 87 88 EFI_STATUS 89 EFIAPI 90 EblPerformDHCP ( 91 IN BOOLEAN SortOffers 92 ) 93 { 94 EFI_STATUS Status; 95 EFI_PXE_BASE_CODE_PROTOCOL *Pxe; 96 97 Status = gBS->LocateProtocol (&gEfiPxeBaseCodeProtocolGuid, NULL, (VOID **)&Pxe); 98 if (EFI_ERROR(Status)) { 99 return Status; 100 } 101 102 Status = Pxe->Start (Pxe, gUseIpv6); 103 if (EFI_ERROR(Status) && (Status != EFI_ALREADY_STARTED)) { 104 return Status; 105 } 106 107 Status = Pxe->Dhcp(Pxe, TRUE); 108 return Status; 109 } 110 111 112 EFI_STATUS 113 EFIAPI 114 EblSetStationIp ( 115 IN EFI_IP_ADDRESS *NewStationIp, OPTIONAL 116 IN EFI_IP_ADDRESS *NewSubnetMask OPTIONAL 117 ) 118 { 119 EFI_STATUS Status; 120 EFI_PXE_BASE_CODE_PROTOCOL *Pxe; 121 122 Status = gBS->LocateProtocol (&gEfiPxeBaseCodeProtocolGuid, NULL, (VOID **)&Pxe); 123 if (EFI_ERROR(Status)) { 124 return Status; 125 } 126 127 Status = Pxe->Start (Pxe, gUseIpv6); 128 if (EFI_ERROR(Status) && (Status != EFI_ALREADY_STARTED)) { 129 return Status; 130 } 131 132 Status = Pxe->SetStationIp (Pxe, NewStationIp, NewSubnetMask); 133 return Status; 134 } 135 136 137 EFI_STATUS 138 EFIAPI 139 EblMtftp ( 140 IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, 141 IN OUT VOID *BufferPtr OPTIONAL, 142 IN BOOLEAN Overwrite, 143 IN OUT UINT64 *BufferSize, 144 IN UINTN *BlockSize OPTIONAL, 145 IN EFI_IP_ADDRESS *ServerIp, 146 IN UINT8 *Filename OPTIONAL, 147 IN EFI_PXE_BASE_CODE_MTFTP_INFO *Info OPTIONAL, 148 IN BOOLEAN DontUseBuffer 149 ) 150 { 151 EFI_STATUS Status; 152 EFI_PXE_BASE_CODE_PROTOCOL *Pxe; 153 154 Status = gBS->LocateProtocol (&gEfiPxeBaseCodeProtocolGuid, NULL, (VOID **)&Pxe); 155 if (EFI_ERROR(Status)) { 156 return Status; 157 } 158 159 Status = Pxe->Mtftp ( 160 Pxe, 161 Operation, 162 BufferPtr, 163 Overwrite, 164 BufferSize, 165 BlockSize, 166 ServerIp, 167 Filename, 168 Info, 169 DontUseBuffer 170 ); 171 return Status; 172 } 173 174