]> xenbits.xensource.com Git - ovmf.git/commitdiff
RedfishPkg: Redfish discover driver improvement
authorNickle Wang <nicklew@nvidia.com>
Mon, 27 Mar 2023 14:28:58 +0000 (22:28 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Wed, 29 Mar 2023 09:22:35 +0000 (09:22 +0000)
Bug fix:
- function stack fault
- properly handle "SubnetAddrInfoIPv6" when there is no IPv6 support
- copy-n-paste error in RedfishGetHostInterfaceProtocolData()
- fix typo
Enhancement:
- Redfish discover driver now can configure host IP address based on
  the information from SMBIOS type 42 record. This saves the effort of
  configuring host IP address in setup menu.
- Performance improvement to driver binding process. Redfish discover
  driver will wait until all required drivers are ready and do driver
  binding start().
- Use CopyGuid() to copy GUID instead of intrinsic function.
- Error handling when SMBIOS data is corrupted.

Signed-off-by: Nickle Wang <nicklew@nvidia.com>
Cc: Abner Chang <abner.chang@amd.com>
Cc: Igor Kulchytskyy <igork@ami.com>
Cc: Nick Ramirez <nramirez@nvidia.com>
Reviewed-by: Abner Chang <abner.chang@amd.com>
RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c
RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverInternal.h
RedfishPkg/RedfishDiscoverDxe/RedfishSmbiosHostInterface.c

index 042d6d5fd5df57fabf70d91e0faca210621227a0..f64c79088f63f4db93a9ebcc3984150a38bc1eb5 100644 (file)
@@ -1,9 +1,10 @@
 /** @file\r
 \r
-  The implementation of EFI Redfidh Discover Protocol.\r
+  The implementation of EFI Redfish Discover Protocol.\r
 \r
   (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>\r
   Copyright (c) 2022, AMD Incorporated. All rights reserved.\r
+  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
 \r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -270,10 +271,13 @@ Tcp6GetSubnetInfo (
 \r
   if (IpModedata.AddressCount == 0) {\r
     DEBUG ((DEBUG_INFO, "%a: No IPv6 address configured.\n", __FUNCTION__));\r
+    Instance->SubnetAddrInfoIPv6Number = 0;\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   if (Instance->SubnetAddrInfoIPv6 != NULL) {\r
     FreePool (Instance->SubnetAddrInfoIPv6);\r
+    Instance->SubnetAddrInfoIPv6 = NULL;\r
   }\r
 \r
   Instance->SubnetAddrInfoIPv6 = AllocateZeroPool (IpModedata.AddressCount * sizeof (EFI_IP6_ADDRESS_INFO));\r
@@ -447,7 +451,7 @@ NumberOfNetworkInterface (
 \r
 /**\r
   This function checks the  IP version supported on this\r
-  netwoek interface.\r
+  network interface.\r
 \r
   @param[in]    ThisNetworkInterface   EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL\r
 \r
@@ -472,7 +476,7 @@ CheckIsIpVersion6 (
   @param[in]    Instance     EFI_REDFISH_DISCOVERED_INTERNAL_INSTANCE\r
 \r
   @retval EFI_SUCCESS        Redfish service is discovered through SMBIOS Host interface.\r
-  @retval Others             Fail to discover Redfish service throught SMBIOS host interface\r
+  @retval Others             Fail to discover Redfish service through SMBIOS host interface\r
 \r
 **/\r
 EFI_STATUS\r
@@ -487,7 +491,7 @@ DiscoverRedfishHostInterface (
   CHAR16                         Ipv6Str[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" + 1];\r
   CHAR8                          RedfishServiceLocateStr[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" + 1];\r
   UINTN                          StrSize;\r
-  UINTN                          MacCompareStstus;\r
+  UINTN                          MacCompareStatus;\r
   BOOLEAN                        IsHttps;\r
 \r
   Data             = NULL;\r
@@ -503,24 +507,52 @@ DiscoverRedfishHostInterface (
   Status = RedfishGetHostInterfaceProtocolData (mSmbios, &DeviceDescriptor, &Data); // Search for SMBIOS type 42h\r
   if (!EFI_ERROR (Status) && (Data != NULL) && (DeviceDescriptor != NULL)) {\r
     //\r
-    // Chceck if we can reach out Redfish service using this network interface.\r
-    // Check with MAC address using Device Descroptor Data Device Type 04 and Type 05.\r
+    // Check if we can reach out Redfish service using this network interface.\r
+    // Check with MAC address using Device Descriptor Data Device Type 04 and Type 05.\r
     // Those two types of Redfish host interface device has MAC information.\r
     //\r
     if (DeviceDescriptor->DeviceType == REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2) {\r
-      MacCompareStstus = CompareMem (&Instance->NetworkInterface->MacAddress, &DeviceDescriptor->DeviceDescriptor.PciPcieDeviceV2.MacAddress, 6);\r
+      MacCompareStatus = CompareMem (&Instance->NetworkInterface->MacAddress, &DeviceDescriptor->DeviceDescriptor.PciPcieDeviceV2.MacAddress, 6);\r
     } else if (DeviceDescriptor->DeviceType == REDFISH_HOST_INTERFACE_DEVICE_TYPE_USB_V2) {\r
-      MacCompareStstus = CompareMem (&Instance->NetworkInterface->MacAddress, &DeviceDescriptor->DeviceDescriptor.UsbDeviceV2.MacAddress, 6);\r
+      MacCompareStatus = CompareMem (&Instance->NetworkInterface->MacAddress, &DeviceDescriptor->DeviceDescriptor.UsbDeviceV2.MacAddress, 6);\r
     } else {\r
       return EFI_UNSUPPORTED;\r
     }\r
 \r
-    if (MacCompareStstus != 0) {\r
+    if (MacCompareStatus != 0) {\r
       return EFI_UNSUPPORTED;\r
     }\r
 \r
-    if (Data->RedfishServiceIpAddressFormat == 1) {\r
+    Instance->HostAddrFormat = Data->HostIpAddressFormat;\r
+    if (Data->HostIpAddressFormat == REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP4) {\r
+      IP4_COPY_ADDRESS ((VOID *)&Instance->HostIpAddress.v4, (VOID *)Data->HostIpAddress);\r
+      IP4_COPY_ADDRESS ((VOID *)&Instance->HostSubnetMask.v4, (VOID *)Data->HostIpMask);\r
+\r
+      if (EFI_IP4_EQUAL (&Instance->HostIpAddress.v4, &mZeroIp4Addr)) {\r
+        DEBUG ((DEBUG_ERROR, "%a: invalid host IP address: zero address\n", __FUNCTION__));\r
+        //\r
+        // Invalid IP address detected. Change address format to Unknown and use system default address.\r
+        //\r
+        Instance->HostAddrFormat = REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_UNKNOWN;\r
+      }\r
+\r
+      if (!IP4_IS_VALID_NETMASK (EFI_IP4 (Instance->HostSubnetMask.v4))) {\r
+        DEBUG ((DEBUG_ERROR, "%a: invalid subnet mask address\n", __FUNCTION__));\r
+        //\r
+        // Invalid subnet mast address detected. Change address format to Unknown and use system default address.\r
+        //\r
+        Instance->HostAddrFormat = REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_UNKNOWN;\r
+      }\r
+    } else if (Data->HostIpAddressFormat == REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP6) {\r
+      IP6_COPY_ADDRESS ((VOID *)&Instance->HostIpAddress.v6, (VOID *)Data->HostIpAddress);\r
+    }\r
+\r
+    if (Data->RedfishServiceIpAddressFormat == REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP4) {\r
       IP4_COPY_ADDRESS ((VOID *)&Instance->TargetIpAddress.v4, (VOID *)Data->RedfishServiceIpAddress);\r
+\r
+      if (EFI_IP4_EQUAL (&Instance->TargetIpAddress.v4, &mZeroIp4Addr)) {\r
+        DEBUG ((DEBUG_ERROR, "%a: invalid service IP address: zero address\n", __FUNCTION__));\r
+      }\r
     } else {\r
       IP6_COPY_ADDRESS ((VOID *)&Instance->TargetIpAddress.v6, (VOID *)Data->RedfishServiceIpAddress);\r
     }\r
@@ -530,7 +562,7 @@ DiscoverRedfishHostInterface (
       Status = EFI_UNSUPPORTED;\r
     } else {\r
       //\r
-      // Add this istance to list without detial information of Redfish\r
+      // Add this instance to list without detail information of Redfish\r
       // service.\r
       //\r
       IsHttps = FALSE;\r
@@ -614,7 +646,7 @@ DiscoverRedfishHostInterface (
   @param[in]  Os                    OS string.\r
   @param[in]  OsVer                 OS version string.\r
   @param[in]  Product               Product string.\r
-  @param[in]  ProductVer            Product verison string.\r
+  @param[in]  ProductVer            Product version string.\r
   @param[in]  UseHttps              Redfish service requires secured connection.\r
   @retval EFI_SUCCESS               Redfish service is added to list successfully.\r
 \r
@@ -671,7 +703,7 @@ AddAndSignalNewRedfishService (
     do {\r
       if ((Char16Uuid == NULL) || (DiscoveredList->Instance->Information.Uuid == NULL)) {\r
         //\r
-        // Check if this Redfish instance already found using IP addrress.\r
+        // Check if this Redfish instance already found using IP address.\r
         //\r
         if (!CheckIsIpVersion6 (NetworkInterface)) {\r
           if (CompareMem (\r
@@ -849,6 +881,10 @@ AddAndSignalNewRedfishService (
           Status = EFI_OUT_OF_RESOURCES;\r
           goto EXIT_FREE_CONFIG_DATA;\r
         }\r
+\r
+        if (Instance->HostAddrFormat == REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP6) {\r
+          IP6_COPY_ADDRESS (&RestExHttpConfigData->HttpConfigData.AccessPoint.IPv6Node->LocalAddress, &Instance->HostIpAddress.v6);\r
+        }\r
       } else {\r
         RestExHttpConfigData->HttpConfigData.AccessPoint.IPv4Node = AllocateZeroPool (sizeof (EFI_HTTPv4_ACCESS_POINT));\r
         if (RestExHttpConfigData->HttpConfigData.AccessPoint.IPv4Node == NULL) {\r
@@ -856,7 +892,13 @@ AddAndSignalNewRedfishService (
           goto EXIT_FREE_CONFIG_DATA;\r
         }\r
 \r
-        RestExHttpConfigData->HttpConfigData.AccessPoint.IPv4Node->UseDefaultAddress = TRUE;\r
+        if (Instance->HostAddrFormat == REDFISH_HOST_INTERFACE_HOST_IP_ADDRESS_FORMAT_IP4) {\r
+          RestExHttpConfigData->HttpConfigData.AccessPoint.IPv4Node->UseDefaultAddress = FALSE;\r
+          IP4_COPY_ADDRESS (&RestExHttpConfigData->HttpConfigData.AccessPoint.IPv4Node->LocalAddress, &Instance->HostIpAddress.v4);\r
+          IP4_COPY_ADDRESS (&RestExHttpConfigData->HttpConfigData.AccessPoint.IPv4Node->LocalSubnet, &Instance->HostSubnetMask.v4);\r
+        } else {\r
+          RestExHttpConfigData->HttpConfigData.AccessPoint.IPv4Node->UseDefaultAddress = TRUE;\r
+        }\r
       }\r
 \r
       Status = RestEx->Configure (\r
@@ -955,7 +997,7 @@ NetworkInterfaceGetSubnetInfo (
                                                Instance\r
                                                );\r
     if (EFI_ERROR (Status)) {\r
-      DEBUG ((DEBUG_ERROR, "%a:Faile to get Subnet infomation.\n", __FUNCTION__));\r
+      DEBUG ((DEBUG_ERROR, "%a:Failed to get Subnet infomation.\n", __FUNCTION__));\r
       return Status;\r
     } else {\r
       DEBUG ((DEBUG_INFO, "%a:MAC address: %s\n", __FUNCTION__, Instance->StrMacAddr));\r
@@ -982,7 +1024,7 @@ NetworkInterfaceGetSubnetInfo (
         ThisSubnetAddrInfoIPv6++;\r
         for (IPv6InfoIndex = 0; IPv6InfoIndex < Instance->SubnetAddrInfoIPv6Number - 1; IPv6InfoIndex++) {\r
           //\r
-          // Build up addtional EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL instances.\r
+          // Build up additional EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL instances.\r
           //\r
           NewNetworkInterface = (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL *)AllocateZeroPool (sizeof (EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL));\r
           if (NewNetworkInterface != NULL) {\r
@@ -1103,9 +1145,9 @@ RedfishServiceGetNetworkInterface (
 /**\r
   This function acquires Redfish services by discovering static Redfish setting\r
   according to Redfish Host Interface or through SSDP. Returns a list of EFI\r
-  handles in EFI_REDFISH_DISCOVERED_LIST. Each of EFI handle has cooresponding\r
-  EFI REST EX instance installed on it. Each REST EX isntance is a child instance which\r
-  created through EFI REST EX serivce protoocl for communicating with specific\r
+  handles in EFI_REDFISH_DISCOVERED_LIST. Each of EFI handle has corresponding\r
+  EFI REST EX instance installed on it. Each REST EX instance is a child instance which\r
+  created through EFI REST EX service protocol for communicating with specific\r
   Redfish service.\r
 \r
   @param[in]    This                    EFI_REDFISH_DISCOVER_PROTOCOL instance.\r
@@ -1255,7 +1297,7 @@ RedfishServiceAbortAcquire (
   )\r
 {\r
   // This function is used to abort Redfish service discovery through SSDP\r
-  // on the network interface. SSDP is optionally supprted by EFI_REDFISH_DISCOVER_PROTOCOL,\r
+  // on the network interface. SSDP is optionally suppoted by EFI_REDFISH_DISCOVER_PROTOCOL,\r
   // we dont have implementation for SSDP now.\r
 \r
   return EFI_UNSUPPORTED;\r
@@ -1425,7 +1467,7 @@ CreateRedfishDiscoverNetworkInterface (
 }\r
 \r
 /**\r
-  This function destory network interface\r
+  This function destroy network interface\r
 \r
 \r
   @param[in]  ThisNetworkInterface EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL instance.\r
@@ -1433,7 +1475,7 @@ CreateRedfishDiscoverNetworkInterface (
   @retval EFI_STATUS\r
 **/\r
 EFI_STATUS\r
-DestroyRedfishNetwrokInterface (\r
+DestroyRedfishNetworkInterface (\r
   IN EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL  *ThisNetworkInterface\r
   )\r
 {\r
@@ -1467,11 +1509,13 @@ TestForRequiredProtocols (
   IN EFI_HANDLE                   ControllerHandle\r
   )\r
 {\r
-  UINT32      Id;\r
+  UINT32      *Id;\r
   UINTN       Index;\r
   EFI_STATUS  Status;\r
+  UINTN       ListCount;\r
 \r
-  for (Index = 0; Index < (sizeof (gRequiredProtocol) / sizeof (REDFISH_DISCOVER_REQUIRED_PROTOCOL)); Index++) {\r
+  ListCount = (sizeof (gRequiredProtocol) / sizeof (REDFISH_DISCOVER_REQUIRED_PROTOCOL));\r
+  for (Index = 0; Index < ListCount; Index++) {\r
     Status = gBS->OpenProtocol (\r
                     ControllerHandle,\r
                     gRequiredProtocol[Index].RequiredServiceBindingProtocolGuid,\r
@@ -1490,8 +1534,10 @@ TestForRequiredProtocols (
                       EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
                       );\r
       if (EFI_ERROR (Status)) {\r
-        DEBUG ((DEBUG_ERROR, "%a: %s is found on this controller handle.\n", __FUNCTION__, gRequiredProtocol[Index].ProtocolName));\r
-        return EFI_SUCCESS;\r
+        if (Index == ListCount - 1) {\r
+          DEBUG ((DEBUG_ERROR, "%a: all required protocols are found on this controller handle: %p.\n", __FUNCTION__, ControllerHandle));\r
+          return EFI_SUCCESS;\r
+        }\r
       }\r
     }\r
   }\r
@@ -1517,7 +1563,7 @@ BuildupNetworkInterface (
   IN EFI_HANDLE                   ControllerHandle\r
   )\r
 {\r
-  UINT32                                           Id;\r
+  UINT32                                           *Id;\r
   UINT32                                           Index;\r
   EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL  *NetworkInterface;\r
   BOOLEAN                                          IsNew;\r
@@ -1578,13 +1624,11 @@ BuildupNetworkInterface (
         return Status;\r
       }\r
 \r
-      NetworkInterface->NetworkProtocolType                       = gRequiredProtocol[Index].ProtocolType;\r
-      NetworkInterface->OpenDriverAgentHandle                     = This->DriverBindingHandle;\r
-      NetworkInterface->OpenDriverControllerHandle                = ControllerHandle;\r
-      NetworkInterface->NetworkInterfaceProtocolInfo.ProtocolGuid = \\r
-        *gRequiredProtocol[Index].RequiredProtocolGuid;\r
-      NetworkInterface->NetworkInterfaceProtocolInfo.ProtocolServiceGuid = \\r
-        *gRequiredProtocol[Index].RequiredServiceBindingProtocolGuid;\r
+      NetworkInterface->NetworkProtocolType        = gRequiredProtocol[Index].ProtocolType;\r
+      NetworkInterface->OpenDriverAgentHandle      = This->DriverBindingHandle;\r
+      NetworkInterface->OpenDriverControllerHandle = ControllerHandle;\r
+      CopyGuid (&NetworkInterface->NetworkInterfaceProtocolInfo.ProtocolGuid, gRequiredProtocol[Index].RequiredProtocolGuid);\r
+      CopyGuid (&NetworkInterface->NetworkInterfaceProtocolInfo.ProtocolServiceGuid, gRequiredProtocol[Index].RequiredServiceBindingProtocolGuid);\r
       ProtocolDiscoverIdPtr        = &NetworkInterface->NetworkInterfaceProtocolInfo.ProtocolDiscoverId;\r
       OpenDriverAgentHandle        = NetworkInterface->OpenDriverAgentHandle;\r
       OpenDriverControllerHandle   = NetworkInterface->OpenDriverControllerHandle;\r
@@ -1598,7 +1642,7 @@ BuildupNetworkInterface (
 \r
       gBS->RestoreTPL (OldTpl);\r
     } else {\r
-      // Record REST_EX instance. REST_EX is created when clinet asks for Redfish service discovery.\r
+      // Record REST_EX instance. REST_EX is created when client asks for Redfish service discovery.\r
       // Redfish Service Discover protocol will match REST EX to the corresponding EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL\r
       // when discovery.\r
 \r
@@ -1655,9 +1699,9 @@ BuildupNetworkInterface (
                       );\r
       if (!EFI_ERROR (Status)) {\r
         if ((gRequiredProtocol[Index].ProtocolType == ProtocolTypeRestEx)) {\r
-          // Install Redfish Discover Protocol when EFI REST EX protcol is discovered.\r
+          // Install Redfish Discover Protocol when EFI REST EX protocol is discovered.\r
           // This ensures EFI REST EX is ready while the consumer of EFI_REDFISH_DISCOVER_PROTOCOL\r
-          // acquires Redfish serivce over network interface.\r
+          // acquires Redfish service over network interface.\r
 \r
           if (!NewNetworkInterfaceInstalled) {\r
             NetworkInterface = GetTargetNetworkInterfaceInternalByController (ControllerHandle);\r
@@ -1678,6 +1722,14 @@ BuildupNetworkInterface (
           if (EFI_ERROR (Status)) {\r
             DEBUG ((DEBUG_ERROR, "%a: Fail to install EFI_REDFISH_DISCOVER_PROTOCOL\n", __FUNCTION__));\r
           }\r
+        } else {\r
+          DEBUG ((DEBUG_INFO, "%a: Not REST EX, continue with next\n", __FUNCTION__));\r
+          Index++;\r
+          if (Index == (sizeof (gRequiredProtocol) / sizeof (REDFISH_DISCOVER_REQUIRED_PROTOCOL))) {\r
+            break;\r
+          }\r
+\r
+          continue;\r
         }\r
       }\r
 \r
@@ -1692,11 +1744,11 @@ BuildupNetworkInterface (
     }\r
   } while (Index < (sizeof (gRequiredProtocol) / sizeof (REDFISH_DISCOVER_REQUIRED_PROTOCOL)));\r
 \r
-  return EFI_UNSUPPORTED;\r
+  return EFI_DEVICE_ERROR;\r
 }\r
 \r
 /**\r
-  Close the protocol opened for Redfish discovery. This function also destories\r
+  Close the protocol opened for Redfish discovery. This function also destroy\r
   the network services.\r
 \r
   @param[in]  ThisBindingProtocol     A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
@@ -1707,8 +1759,8 @@ BuildupNetworkInterface (
   @param[in]  DriverAgentHandle      Driver agent handle which used to open protocol earlier.\r
   @param[in]  DriverControllerHandle Driver controller handle which used to open protocol earlier.\r
 \r
-  @retval EFI_SUCCESS                Prorocol is closed successfully.\r
-  @retval Others                     Prorocol is closed unsuccessfully.\r
+  @retval EFI_SUCCESS                Protocol is closed successfully.\r
+  @retval Others                     Protocol is closed unsuccessfully.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1748,7 +1800,7 @@ CloseProtocolService (
                                    must support a protocol interface that supplies\r
                                    an I/O abstraction to the driver.\r
   @retval EFI_SUCCESS              One of required protocol is found.\r
-  @retval Others                   Faile to stop the services on network interface.\r
+  @retval Others                   Failed to stop the services on network interface.\r
 **/\r
 EFI_STATUS\r
 StopServiceOnNetworkInterface (\r
@@ -1792,14 +1844,14 @@ StopServiceOnNetworkInterface (
                        ThisNetworkInterface->OpenDriverControllerHandle\r
                        );\r
             if (!EFI_ERROR (Status)) {\r
-              Status = DestroyRedfishNetwrokInterface (ThisNetworkInterface);\r
+              Status = DestroyRedfishNetworkInterface (ThisNetworkInterface);\r
             }\r
 \r
             gBS->RestoreTPL (OldTpl);\r
 \r
             //\r
             // Disconnect EFI Redfish discover driver controller to notify the\r
-            // clinet which uses .EFI Redfish discover protocol.\r
+            // client which uses .EFI Redfish discover protocol.\r
             //\r
             if (DiscoverProtocolHandle != NULL) {\r
               gBS->DisconnectController (DiscoverProtocolHandle, NULL, NULL);\r
@@ -1945,7 +1997,7 @@ RedfishDiscoverDriverBindingSupported (
   @retval EFI_SUCCESS              The device was started.\r
   @retval EFI_DEVICE_ERROR         The device could not be started due to a device error.Currently not implemented.\r
   @retval EFI_OUT_OF_RESOURCES     The request could not be completed due to a lack of resources.\r
-  @retval Others                   The driver failded to start the device.\r
+  @retval Others                   The driver failed to start the device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -2030,7 +2082,7 @@ RedfishDiscoverEntryPoint (
   InitializeListHead (&mEfiRedfishDiscoverNetworkInterface);\r
   InitializeListHead (&mEfiRedfishDiscoverRestExInstance);\r
   //\r
-  // Install binding protoocl to obtain UDP and REST EX protocol.\r
+  // Install binding protocol to obtain UDP and REST EX protocol.\r
   //\r
   Status = EfiLibInstallDriverBindingComponentName2 (\r
              ImageHandle,\r
index 04fa09e1cc23e1258f586bd069f51e6323586ea6..2704cd955d4402542c618f1850ca013da65b9ad6 100644 (file)
@@ -3,6 +3,7 @@
 \r
   (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>\r
   Copyright (c) 2022, AMD Incorporated. All rights reserved.\r
+  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
 \r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -102,7 +103,7 @@ typedef struct {
   UINT32                                         SubnetAddrInfoIPv6Number;   ///< IPv6 address info number.\r
   EFI_IP6_ADDRESS_INFO                           *SubnetAddrInfoIPv6;        ///< IPv6 address info.\r
   //\r
-  // Network interface protocol and REST EX infor.\r
+  // Network interface protocol and REST EX info.\r
   //\r
   UINT32                                         NetworkProtocolType;          ///< Network protocol type. Refer to\r
                                                                                ///< NETWORK_INTERFACE_PROTOCOL_TYPE.\r
@@ -112,7 +113,7 @@ typedef struct {
   // EFI_REDFISH_DISCOVER_PROTOCOL instance installed\r
   // on this network interface.\r
   //\r
-  EFI_HANDLE                                     EfiRedfishDiscoverProtocolHandle; ///< EFI_REDFISH_DISCOVER_PROTOTOCOL instance installed\r
+  EFI_HANDLE                                     EfiRedfishDiscoverProtocolHandle; ///< EFI_REDFISH_DISCOVER_PROTOCOL instance installed\r
                                                                                    ///< on this network interface.\r
 } EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL;\r
 \r
@@ -123,7 +124,7 @@ typedef struct {
   LIST_ENTRY              Entry;                      ///< Link list entry.\r
   EFI_HANDLE              OpenDriverAgentHandle;      ///< The agent to open network protocol.\r
   EFI_HANDLE              OpenDriverControllerHandle; ///< The controller handle to open network protocol.\r
-  EFI_HANDLE              RestExChildHandle;          ///< The child handle created throught REST EX Service Protocol.\r
+  EFI_HANDLE              RestExChildHandle;          ///< The child handle created through REST EX Service Protocol.\r
   EFI_HANDLE              RestExControllerHandle;     ///< The controller handle which provide REST EX protocol.\r
   EFI_REST_EX_PROTOCOL    *RestExProtocolInterface;   ///< Pointer to EFI_REST_EX_PROTOCOL.\r
   UINT32                  RestExId;                   ///< The identifier installed on REST EX controller handle.\r
@@ -178,15 +179,18 @@ typedef struct {
   EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL    *NetworkInterface; ///< EFI_REDFISH_DISCOVER_NETWORK_INTERFACE_INTERNAL\r
                                                                         ///< instance used to discover Redfish service.\r
   //\r
-  // Below for Host insterface discovery.\r
+  // Below for Host interface discovery.\r
   //\r
   BOOLEAN                                            HostIntfValidation; ///< Indicates whether to validate Redfish Host interface.\r
   EFI_IP_ADDRESS                                     TargetIpAddress;    ///< Target IP address reported in Redfish Host interface.\r
+  UINT8                                              HostAddrFormat;     ///< Unknown=00h, Ipv4=01h, Ipv6=02h.\r
+  EFI_IP_ADDRESS                                     HostIpAddress;      ///< Host IP address reported in Redfish Host interface.\r
+  EFI_IP_ADDRESS                                     HostSubnetMask;     ///< Host subnet mask address reported in Redfish Host interface.\r
 } EFI_REDFISH_DISCOVERED_INTERNAL_INSTANCE;\r
 \r
 /**\r
-  The function adds a new foudn Redfish service to internal list and\r
-  notify clinet.\r
+  The function adds a new found Redfish service to internal list and\r
+  notify client.\r
 \r
   It simply frees the packet.\r
 \r
@@ -197,7 +201,7 @@ typedef struct {
   @param[in]  Os                    OS string.\r
   @param[in]  OsVer                 OS version string.\r
   @param[in]  Product               Product string.\r
-  @param[in]  ProductVer            Product verison string.\r
+  @param[in]  ProductVer            Product version string.\r
   @param[in]  UseHttps              Redfish service requires secured connection.\r
   @retval EFI_SUCCESS               Redfish service is added to list successfully.\r
 \r
@@ -224,7 +228,7 @@ AddAndSignalNewRedfishService (
   @param[out] DeviceDescriptor Pointer to REDFISH_INTERFACE_DATA.\r
   @param[out] ProtocolData     Pointer to REDFISH_OVER_IP_PROTOCOL_DATA.\r
 \r
-  @retval EFI_SUCCESS    Get host interface succesfully.\r
+  @retval EFI_SUCCESS    Get host interface successfully.\r
   @retval Otherwise      Fail to tet host interface.\r
 \r
 **/\r
index 88cec1f416939205a4013dd6d17666dcec73ba3e..0d6edc7dc350ecce2f2328570c4873b2cfe2dd91 100644 (file)
@@ -4,6 +4,7 @@
   Discover Redfish SMBIOS Host Interface.\r
 \r
   (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>\r
+  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
 \r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -22,7 +23,7 @@ SMBIOS_TABLE_TYPE42  *mType42Record;
   @param[out] DeviceDescriptor Pointer to REDFISH_INTERFACE_DATA.\r
   @param[out] ProtocolData     Pointer to REDFISH_OVER_IP_PROTOCOL_DATA.\r
 \r
-  @retval EFI_SUCCESS    Get host interface succesfully.\r
+  @retval EFI_SUCCESS    Get host interface successfully.\r
   @retval Otherwise      Fail to tet host interface.\r
 \r
 **/\r
@@ -69,9 +70,15 @@ RedfishGetHostInterfaceProtocolData (
         //\r
         if ((*RecordTmp == REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2) || (*RecordTmp == REDFISH_HOST_INTERFACE_DEVICE_TYPE_USB_V2)) {\r
           if (*RecordTmp == REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2) {\r
-            ASSERT (SpecificDataLen == sizeof (PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2) + 1);\r
+            if (SpecificDataLen != sizeof (PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2) + 1) {\r
+              ASSERT (SpecificDataLen == sizeof (PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2) + 1);\r
+              return EFI_VOLUME_CORRUPTED;\r
+            }\r
           } else {\r
-            ASSERT (SpecificDataLen > sizeof (REDFISH_HOST_INTERFACE_DEVICE_TYPE_USB_V2) + 1);\r
+            if (SpecificDataLen != sizeof (USB_INTERFACE_DEVICE_DESCRIPTOR_V2) + 1) {\r
+              ASSERT (SpecificDataLen == sizeof (USB_INTERFACE_DEVICE_DESCRIPTOR_V2) + 1);\r
+              return EFI_VOLUME_CORRUPTED;\r
+            }\r
           }\r
 \r
           *DeviceDescriptor = (REDFISH_INTERFACE_DATA *)RecordTmp;\r