]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c
NetworkPkg: Add warning message for PXE if failed to read system GUID from SMBIOS.
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcImpl.c
index 52095c5f76c9e03e8f31b008b4488df1c9ba45f2..d3146c3a7e5feb958d6be1e778c600e7d94ced47 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   This implementation of EFI_PXE_BASE_CODE_PROTOCOL and EFI_LOAD_FILE_PROTOCOL.\r
 \r
 /** @file\r
   This implementation of EFI_PXE_BASE_CODE_PROTOCOL and EFI_LOAD_FILE_PROTOCOL.\r
 \r
-  Copyright (c) 2007 - 2016, 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
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -95,19 +95,19 @@ EfiPxeBcStart (
     //\r
     // Configure block size for TFTP as a default value to handle all link layers.\r
     //\r
     //\r
     // Configure block size for TFTP as a default value to handle all link layers.\r
     //\r
-    Private->BlockSize = (UINTN) (Private->Ip6MaxPacketSize -\r
-                           PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE);\r
+    Private->BlockSize = Private->Ip6MaxPacketSize -\r
+                           PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE;\r
 \r
     //\r
     // PXE over IPv6 starts here, initialize the fields and list header.\r
     //\r
     Private->Ip6Policy                          = PXEBC_IP6_POLICY_MAX;\r
 \r
     //\r
     // PXE over IPv6 starts here, initialize the fields and list header.\r
     //\r
     Private->Ip6Policy                          = PXEBC_IP6_POLICY_MAX;\r
-    Private->ProxyOffer.Dhcp6.Packet.Offer.Size = PXEBC_DHCP6_PACKET_MAX_SIZE;\r
-    Private->DhcpAck.Dhcp6.Packet.Ack.Size      = PXEBC_DHCP6_PACKET_MAX_SIZE;\r
-    Private->PxeReply.Dhcp6.Packet.Ack.Size     = PXEBC_DHCP6_PACKET_MAX_SIZE;\r
+    Private->ProxyOffer.Dhcp6.Packet.Offer.Size = PXEBC_CACHED_DHCP6_PACKET_MAX_SIZE;\r
+    Private->DhcpAck.Dhcp6.Packet.Ack.Size      = PXEBC_CACHED_DHCP6_PACKET_MAX_SIZE;\r
+    Private->PxeReply.Dhcp6.Packet.Ack.Size     = PXEBC_CACHED_DHCP6_PACKET_MAX_SIZE;\r
 \r
     for (Index = 0; Index < PXEBC_OFFER_MAX_NUM; Index++) {\r
 \r
     for (Index = 0; Index < PXEBC_OFFER_MAX_NUM; Index++) {\r
-      Private->OfferBuffer[Index].Dhcp6.Packet.Offer.Size = PXEBC_DHCP6_PACKET_MAX_SIZE;\r
+      Private->OfferBuffer[Index].Dhcp6.Packet.Offer.Size = PXEBC_CACHED_DHCP6_PACKET_MAX_SIZE;\r
     }\r
 \r
     //\r
     }\r
 \r
     //\r
@@ -148,18 +148,18 @@ EfiPxeBcStart (
     //\r
     // Configure block size for TFTP as a default value to handle all link layers.\r
     //\r
     //\r
     // Configure block size for TFTP as a default value to handle all link layers.\r
     //\r
-    Private->BlockSize = (UINTN) (Private->Ip4MaxPacketSize -\r
-                           PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE);\r
+    Private->BlockSize = Private->Ip4MaxPacketSize -\r
+                           PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE;\r
 \r
     //\r
     // PXE over IPv4 starts here, initialize the fields.\r
     //\r
 \r
     //\r
     // PXE over IPv4 starts here, initialize the fields.\r
     //\r
-    Private->ProxyOffer.Dhcp4.Packet.Offer.Size = PXEBC_DHCP4_PACKET_MAX_SIZE;\r
-    Private->DhcpAck.Dhcp4.Packet.Ack.Size      = PXEBC_DHCP4_PACKET_MAX_SIZE;\r
-    Private->PxeReply.Dhcp4.Packet.Ack.Size     = PXEBC_DHCP4_PACKET_MAX_SIZE;\r
+    Private->ProxyOffer.Dhcp4.Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
+    Private->DhcpAck.Dhcp4.Packet.Ack.Size      = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
+    Private->PxeReply.Dhcp4.Packet.Ack.Size     = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
 \r
     for (Index = 0; Index < PXEBC_OFFER_MAX_NUM; Index++) {\r
 \r
     for (Index = 0; Index < PXEBC_OFFER_MAX_NUM; Index++) {\r
-      Private->OfferBuffer[Index].Dhcp4.Packet.Offer.Size = PXEBC_DHCP4_PACKET_MAX_SIZE;\r
+      Private->OfferBuffer[Index].Dhcp4.Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;\r
     }\r
 \r
     PxeBcSeedDhcp4Packet (&Private->SeedPacket, Private->Udp4Read);\r
     }\r
 \r
     PxeBcSeedDhcp4Packet (&Private->SeedPacket, Private->Udp4Read);\r
@@ -855,11 +855,19 @@ EfiPxeBcMtftp (
       (Filename == NULL) ||\r
       (BufferSize == NULL) ||\r
       (ServerIp == NULL) ||\r
       (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
       ((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
   Config    = NULL;\r
   Status    = EFI_DEVICE_ERROR;\r
   Private   = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);\r
@@ -1085,7 +1093,8 @@ EfiPxeBcUdpWrite (
     DoNotFragment = TRUE;\r
   }\r
 \r
     DoNotFragment = TRUE;\r
   }\r
 \r
-  if (!Mode->UsingIpv6 && GatewayIp != NULL && !NetIp4IsUnicast (NTOHL (GatewayIp->Addr[0]), EFI_NTOHL(Mode->SubnetMask))) {\r
+  if (!Mode->UsingIpv6 && GatewayIp != NULL && Mode->SubnetMask.Addr[0] != 0 && \r
+      !NetIp4IsUnicast (NTOHL (GatewayIp->Addr[0]), EFI_NTOHL(Mode->SubnetMask))) {\r
     //\r
     // Gateway is provided but it's not a unicast IPv4 address, while it will be ignored for IPv6.\r
     //\r
     //\r
     // Gateway is provided but it's not a unicast IPv4 address, while it will be ignored for IPv6.\r
     //\r
@@ -1924,7 +1933,7 @@ EfiPxeBcSetParameters (
       // Update the previous PxeBcCallback protocol.\r
       //\r
       Status = gBS->HandleProtocol (\r
       // 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
                       &gEfiPxeBaseCodeCallbackProtocolGuid,\r
                       (VOID **) &Private->PxeBcCallback\r
                       );\r
@@ -1940,6 +1949,7 @@ EfiPxeBcSetParameters (
 \r
   if (NewSendGUID != NULL) {\r
     if (*NewSendGUID && EFI_ERROR (NetLibGetSystemGuid (&SystemGuid))) {\r
 \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
       return EFI_INVALID_PARAMETER;\r
     }\r
     Mode->SendGUID = *NewSendGUID;\r
@@ -2013,10 +2023,14 @@ EfiPxeBcSetStationIP (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (!Mode->UsingIpv6 && NewStationIp != NULL && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), NTOHL (NewSubnetMask->Addr[0]))) {\r
-    return EFI_INVALID_PARAMETER;\r
+  if (!Mode->UsingIpv6 && NewStationIp != NULL) {\r
+    if (IP4_IS_UNSPECIFIED(NTOHL (NewStationIp->Addr[0])) || \r
+        IP4_IS_LOCAL_BROADCAST(NTOHL (NewStationIp->Addr[0])) ||\r
+        (NewSubnetMask != NULL && NewSubnetMask->Addr[0] != 0 && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), NTOHL (NewSubnetMask->Addr[0])))) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
   }\r
   }\r
-\r
+  \r
   if (!Mode->Started) {\r
     return EFI_NOT_STARTED;\r
   }\r
   if (!Mode->Started) {\r
     return EFI_NOT_STARTED;\r
   }\r
@@ -2342,35 +2356,31 @@ EfiPxeLoadFile (
   EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
   BOOLEAN                     UsingIpv6;\r
   EFI_STATUS                  Status;\r
   EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
   BOOLEAN                     UsingIpv6;\r
   EFI_STATUS                  Status;\r
-  BOOLEAN                     MediaPresent;\r
+  EFI_STATUS                  MediaStatus;\r
 \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
     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
   // 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
 \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
     return EFI_NO_MEDIA;\r
   }\r
 \r