]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/UefiPxeBcDxe/PxeBcImpl.c
NetworkPkg/UefiPxeBcDxe: Fix various typos
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcImpl.c
index 0552174ac6553353b429fe4cfca2323132545eab..5d18207b6ce8bdec04dfac94d8d4612a707d7ae9 100644 (file)
@@ -1,15 +1,9 @@
 /** @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
-  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
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -91,23 +85,23 @@ EfiPxeBcStart (
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
     }\r
-    \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
-    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
-      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
@@ -144,22 +138,22 @@ EfiPxeBcStart (
     if (EFI_ERROR (Status)) {\r
       goto ON_ERROR;\r
     }\r
-    \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
-    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
-      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
@@ -206,11 +200,11 @@ EfiPxeBcStart (
     }\r
 \r
     //\r
-    //DHCP4 service allows only one of its children to be configured in  \r
-    //the active state, If the DHCP4 D.O.R.A started by IP4 auto  \r
-    //configuration and has not been completed, the Dhcp4 state machine \r
-    //will not be in the right state for the PXE to start a new round D.O.R.A. \r
-    //so we need to switch it's policy to static.\r
+    //DHCP4 service allows only one of its children to be configured in\r
+    //the active state, If the DHCP4 D.O.R.A started by IP4 auto\r
+    //configuration and has not been completed, the Dhcp4 state machine\r
+    //will not be in the right state for the PXE to start a new round D.O.R.A.\r
+    //so we need to switch its policy to static.\r
     //\r
     Status = PxeBcSetIp4Policy (Private);\r
     if (EFI_ERROR (Status)) {\r
@@ -637,7 +631,7 @@ EfiPxeBcDiscover (
       }\r
       if (Index != Info->IpCnt) {\r
         //\r
-        // It's invalid if the first server doesn't accecpt any response\r
+        // It's invalid if the first server doesn't accept any response\r
         // but any of the other servers does accept any response.\r
         //\r
         Status = EFI_INVALID_PARAMETER;\r
@@ -745,13 +739,13 @@ ON_EXIT:
   if (NewCreatedInfo != NULL && NewCreatedInfo != &DefaultInfo) {\r
     FreePool (NewCreatedInfo);\r
   }\r
-  \r
+\r
   if (Mode->UsingIpv6) {\r
     Private->Udp6Read->Configure (Private->Udp6Read, &Private->Udp6CfgData);\r
   } else {\r
     Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData);\r
   }\r
-  \r
+\r
   //\r
   // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP\r
   // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.\r
@@ -849,22 +843,35 @@ EfiPxeBcMtftp (
   VOID                            *Config;\r
   EFI_STATUS                      Status;\r
   EFI_PXE_BASE_CODE_IP_FILTER     IpFilter;\r
-\r
+  UINTN                           WindowSize;\r
 \r
   if ((This == 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
+  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
   Mode      = Private->PxeBc.Mode;\r
 \r
+  //\r
+  // Get PcdPxeTftpWindowSize.\r
+  //\r
+  WindowSize = (UINTN) PcdGet64 (PcdPxeTftpWindowSize);\r
+\r
   if (Mode->UsingIpv6) {\r
     if (!NetIp6IsValidUnicast (&ServerIp->v6)) {\r
       return EFI_INVALID_PARAMETER;\r
@@ -922,6 +929,7 @@ EfiPxeBcMtftp (
                Config,\r
                Filename,\r
                BlockSize,\r
+               (WindowSize > 1) ? &WindowSize : NULL,\r
                BufferSize\r
                );\r
 \r
@@ -936,6 +944,7 @@ EfiPxeBcMtftp (
                Config,\r
                Filename,\r
                BlockSize,\r
+               (WindowSize > 1) ? &WindowSize : NULL,\r
                BufferPtr,\r
                BufferSize,\r
                DontUseBuffer\r
@@ -968,6 +977,7 @@ EfiPxeBcMtftp (
                Config,\r
                Filename,\r
                BlockSize,\r
+               (WindowSize > 1) ? &WindowSize : NULL,\r
                BufferPtr,\r
                BufferSize,\r
                DontUseBuffer\r
@@ -1085,7 +1095,8 @@ EfiPxeBcUdpWrite (
     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
@@ -1399,7 +1410,7 @@ EfiPxeBcUdpRead (
 \r
   if (IsMatched) {\r
     //\r
-    // Copy the rececived packet to user if matched by filter.\r
+    // Copy the received packet to user if matched by filter.\r
     //\r
     if (Mode->UsingIpv6) {\r
       Udp6Rx = Udp6Token.Packet.RxData;\r
@@ -1650,13 +1661,13 @@ EfiPxeBcSetIpFilter (
     //\r
     Udp4Cfg = &Private->Udp4CfgData;\r
     if ((AcceptPromiscuous != Udp4Cfg->AcceptPromiscuous)   ||\r
-         (AcceptBroadcast != Udp4Cfg->AcceptBroadcast)     || MultiCastUpdate) {\r
+        (AcceptBroadcast != Udp4Cfg->AcceptBroadcast)     || MultiCastUpdate) {\r
       //\r
       // Clear the UDP4 instance configuration, all joined groups will be left\r
       // during the operation.\r
       //\r
       Private->Udp4Read->Configure (Private->Udp4Read, NULL);\r
-  \r
+\r
       //\r
       // Configure the UDP instance with the new configuration.\r
       //\r
@@ -1666,7 +1677,7 @@ EfiPxeBcSetIpFilter (
       if (EFI_ERROR (Status)) {\r
         return Status;\r
       }\r
-  \r
+\r
       //\r
       // In not Promiscuous mode, need to join the new multicast group.\r
       //\r
@@ -1674,7 +1685,7 @@ EfiPxeBcSetIpFilter (
         for (Index = 0; Index < NewFilter->IpCnt; ++Index) {\r
           if (IP4_IS_MULTICAST (EFI_NTOHL (NewFilter->IpList[Index].v4))) {\r
             //\r
-            // Join the mutilcast group.\r
+            // Join the multicast group.\r
             //\r
             Status = Private->Udp4Read->Groups (Private->Udp4Read, TRUE, &NewFilter->IpList[Index].v4);\r
             if (EFI_ERROR (Status)) {\r
@@ -1695,7 +1706,7 @@ EfiPxeBcSetIpFilter (
       // during the operation.\r
       //\r
       Private->Udp6Read->Configure (Private->Udp6Read, NULL);\r
-  \r
+\r
       //\r
       // Configure the UDP instance with the new configuration.\r
       //\r
@@ -1704,7 +1715,7 @@ EfiPxeBcSetIpFilter (
       if (EFI_ERROR (Status)) {\r
         return Status;\r
       }\r
-  \r
+\r
       //\r
       // In not Promiscuous mode, need to join the new multicast group.\r
       //\r
@@ -1712,7 +1723,7 @@ EfiPxeBcSetIpFilter (
         for (Index = 0; Index < NewFilter->IpCnt; ++Index) {\r
           if (IP6_IS_MULTICAST (&NewFilter->IpList[Index].v6)) {\r
             //\r
-            // Join the mutilcast group.\r
+            // Join the multicast group.\r
             //\r
             Status = Private->Udp6Read->Groups (Private->Udp6Read, TRUE, &NewFilter->IpList[Index].v6);\r
             if (EFI_ERROR (Status)) {\r
@@ -1924,7 +1935,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
@@ -1940,6 +1951,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
@@ -1993,7 +2005,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
@@ -2014,13 +2025,13 @@ EfiPxeBcSetStationIP (
   }\r
 \r
   if (!Mode->UsingIpv6 && NewStationIp != NULL) {\r
-    if (IP4_IS_UNSPECIFIED(NTOHL (NewStationIp->Addr[0])) || \r
+    if (IP4_IS_UNSPECIFIED(NTOHL (NewStationIp->Addr[0])) ||\r
         IP4_IS_LOCAL_BROADCAST(NTOHL (NewStationIp->Addr[0])) ||\r
-        (NewSubnetMask != NULL && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), NTOHL (NewSubnetMask->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
   if (!Mode->Started) {\r
     return EFI_NOT_STARTED;\r
   }\r
@@ -2033,27 +2044,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
@@ -2067,6 +2057,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
@@ -2346,19 +2340,9 @@ EfiPxeLoadFile (
   EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
   BOOLEAN                     UsingIpv6;\r
   EFI_STATUS                  Status;\r
-  BOOLEAN                     MediaPresent;\r
-\r
-  if (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
+  EFI_STATUS                  MediaStatus;\r
 \r
-  if (This == NULL || BufferSize == NULL) {\r
+  if (This == NULL || BufferSize == NULL || FilePath == NULL || !IsDevicePathEnd (FilePath)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -2369,12 +2353,18 @@ EfiPxeLoadFile (
     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
@@ -2415,7 +2405,7 @@ EfiPxeLoadFile (
   } else {\r
     //\r
     // The DHCP4 can have only one configured child instance so we need to stop\r
-    // reset the DHCP4 child before we return. Otherwise these programs which \r
+    // reset the DHCP4 child before we return. Otherwise these programs which\r
     // also need to use DHCP4 will be impacted.\r
     //\r
     if (!PxeBc->Mode->UsingIpv6) {\r