]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c
ShellPkg/UefiShellAcpiViewCommandLib: Fix ECC issues
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcImpl.c
index ab9e494b56800a449c348978507b19514fb0b973..b828d24288990ea1cc1f1062f39969452dca4688 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   This implementation of EFI_PXE_BASE_CODE_PROTOCOL and EFI_LOAD_FILE_PROTOCOL.\r
 \r
-  Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -855,11 +855,19 @@ EfiPxeBcMtftp (
       (Filename == NULL) ||\r
       (BufferSize == NULL) ||\r
       (ServerIp == NULL) ||\r
-      ((BufferPtr == NULL) && DontUseBuffer) ||\r
       ((BlockSize != NULL) && (*BlockSize < PXE_MTFTP_DEFAULT_BLOCK_SIZE))) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  if (Operation == EFI_PXE_BASE_CODE_TFTP_READ_FILE ||\r
+      Operation == EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY ||\r
+      Operation == EFI_PXE_BASE_CODE_MTFTP_READ_FILE ||\r
+      Operation == EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY) {\r
+    if (BufferPtr == NULL && !DontUseBuffer) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+  }\r
+\r
   Config    = NULL;\r
   Status    = EFI_DEVICE_ERROR;\r
   Private   = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);\r
@@ -1925,7 +1933,7 @@ EfiPxeBcSetParameters (
       // Update the previous PxeBcCallback protocol.\r
       //\r
       Status = gBS->HandleProtocol (\r
-                      Private->Controller,\r
+                      Mode->UsingIpv6 ? Private->Ip6Nic->Controller : Private->Ip4Nic->Controller,\r
                       &gEfiPxeBaseCodeCallbackProtocolGuid,\r
                       (VOID **) &Private->PxeBcCallback\r
                       );\r
@@ -1941,6 +1949,7 @@ EfiPxeBcSetParameters (
 \r
   if (NewSendGUID != NULL) {\r
     if (*NewSendGUID && EFI_ERROR (NetLibGetSystemGuid (&SystemGuid))) {\r
+      DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n"));\r
       return EFI_INVALID_PARAMETER;\r
     }\r
     Mode->SendGUID = *NewSendGUID;\r
@@ -1994,7 +2003,6 @@ EfiPxeBcSetStationIP (
   EFI_STATUS              Status;\r
   PXEBC_PRIVATE_DATA      *Private;\r
   EFI_PXE_BASE_CODE_MODE  *Mode;\r
-  EFI_ARP_CONFIG_DATA     ArpConfigData;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -2034,27 +2042,6 @@ EfiPxeBcSetStationIP (
     if (EFI_ERROR (Status)) {\r
       goto ON_EXIT;\r
     }\r
-  } else if (!Mode->UsingIpv6 && NewStationIp != NULL) {\r
-    //\r
-    // Configure the corresponding ARP with the IPv4 address.\r
-    //\r
-    ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));\r
-\r
-    ArpConfigData.SwAddressType   = 0x0800;\r
-    ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS);\r
-    ArpConfigData.StationAddress  = &NewStationIp->v4;\r
-\r
-    Private->Arp->Configure (Private->Arp, NULL);\r
-    Private->Arp->Configure (Private->Arp, &ArpConfigData);\r
-\r
-    if (NewSubnetMask != NULL) {\r
-      Mode->RouteTableEntries                = 1;\r
-      Mode->RouteTable[0].IpAddr.Addr[0]     = NewStationIp->Addr[0] & NewSubnetMask->Addr[0];\r
-      Mode->RouteTable[0].SubnetMask.Addr[0] = NewSubnetMask->Addr[0];\r
-      Mode->RouteTable[0].GwAddr.Addr[0]     = 0;\r
-    }\r
-\r
-    Private->IsAddressOk = TRUE;\r
   }\r
 \r
   if (NewStationIp != NULL) {\r
@@ -2068,6 +2055,10 @@ EfiPxeBcSetStationIP (
   }\r
 \r
   Status = PxeBcFlushStationIp (Private, NewStationIp, NewSubnetMask);\r
+  if (!EFI_ERROR (Status)) {\r
+    Private->IsAddressOk = TRUE;\r
+  }\r
+  \r
 ON_EXIT:\r
   return Status;\r
 }\r
@@ -2347,35 +2338,31 @@ EfiPxeLoadFile (
   EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
   BOOLEAN                     UsingIpv6;\r
   EFI_STATUS                  Status;\r
-  BOOLEAN                     MediaPresent;\r
+  EFI_STATUS                  MediaStatus;\r
 \r
-  if (FilePath == NULL || !IsDevicePathEnd (FilePath)) {\r
+  if (This == NULL || BufferSize == NULL || FilePath == NULL || !IsDevicePathEnd (FilePath)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   \r
-  VirtualNic = PXEBC_VIRTUAL_NIC_FROM_LOADFILE (This);\r
-  Private    = VirtualNic->Private;\r
-  PxeBc      = &Private->PxeBc;\r
-  UsingIpv6  = FALSE;\r
-  Status     = EFI_DEVICE_ERROR;\r
-\r
-  if (This == NULL || BufferSize == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
   //\r
   // Only support BootPolicy\r
   //\r
   if (!BootPolicy) {\r
     return EFI_UNSUPPORTED;\r
   }\r
+  \r
+  VirtualNic = PXEBC_VIRTUAL_NIC_FROM_LOADFILE (This);\r
+  Private    = VirtualNic->Private;\r
+  PxeBc      = &Private->PxeBc;\r
+  UsingIpv6  = FALSE;\r
+  Status     = EFI_DEVICE_ERROR;\r
 \r
   //\r
   // Check media status before PXE start\r
   //\r
-  MediaPresent = TRUE;\r
-  NetLibDetectMedia (Private->Controller, &MediaPresent);\r
-  if (!MediaPresent) {\r
+  MediaStatus = EFI_SUCCESS;\r
+  NetLibDetectMediaWaitTimeout (Private->Controller, PXEBC_CHECK_MEDIA_WAITING_TIME, &MediaStatus);\r
+  if (MediaStatus != EFI_SUCCESS) {\r
     return EFI_NO_MEDIA;\r
   }\r
 \r