2 RedfishSmbiosHostInterface.c
4 Discover Redfish SMBIOS Host Interface.
6 (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
8 SPDX-License-Identifier: BSD-2-Clause-Patent
12 #include "RedfishDiscoverInternal.h"
14 SMBIOS_TABLE_TYPE42
*mType42Record
;
17 The function gets information reported in Redfish Host Interface.
19 It simply frees the packet.
21 @param[in] Smbios SMBIOS protocol.
22 @param[out] DeviceDescriptor Pointer to REDFISH_INTERFACE_DATA.
23 @param[out] ProtocolData Pointer to REDFISH_OVER_IP_PROTOCOL_DATA.
25 @retval EFI_SUCCESS Get host interface succesfully.
26 @retval Otherwise Fail to tet host interface.
30 RedfishGetHostInterfaceProtocolData (
31 IN EFI_SMBIOS_PROTOCOL
*Smbios
,
32 OUT REDFISH_INTERFACE_DATA
**DeviceDescriptor
,
33 OUT REDFISH_OVER_IP_PROTOCOL_DATA
**ProtocolData
37 EFI_SMBIOS_HANDLE SmbiosHandle
;
38 EFI_SMBIOS_TABLE_HEADER
*Record
;
42 UINT8 SpecificDataLen
;
44 if ((Smbios
== NULL
) || (ProtocolData
== NULL
)) {
45 return EFI_INVALID_PARAMETER
;
48 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
49 Status
= Smbios
->GetNext (Smbios
, &SmbiosHandle
, NULL
, &Record
, NULL
);
50 while (!EFI_ERROR (Status
) && SmbiosHandle
!= SMBIOS_HANDLE_PI_RESERVED
) {
51 if (Record
->Type
== SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE
) {
53 // Check Interface Type, should be Network Host Interface = 40h
55 mType42Record
= (SMBIOS_TABLE_TYPE42
*)Record
;
56 if (mType42Record
->InterfaceType
== MCHostInterfaceTypeNetworkHostInterface
) {
57 ASSERT (Record
->Length
>= 9);
59 RecordTmp
= (UINT8
*)Record
+ Offset
;
61 // Get interface specific data length.
63 SpecificDataLen
= *RecordTmp
;
65 RecordTmp
= (UINT8
*)Record
+ Offset
;
68 // Check Device Type, PCI/PCIe and USB Network Interface v2 is supported.
70 if ((*RecordTmp
== REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2
) || (*RecordTmp
== REDFISH_HOST_INTERFACE_DEVICE_TYPE_USB_V2
)) {
71 if (*RecordTmp
== REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2
) {
72 ASSERT (SpecificDataLen
== sizeof (PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2
) + 1);
74 ASSERT (SpecificDataLen
> sizeof (REDFISH_HOST_INTERFACE_DEVICE_TYPE_USB_V2
) + 1);
77 *DeviceDescriptor
= (REDFISH_INTERFACE_DATA
*)RecordTmp
;
78 Offset
= Offset
+ SpecificDataLen
;
79 RecordTmp
= (UINT8
*)Record
+ Offset
;
81 // Check Protocol count. if > 1, only use the first protocol.
83 ASSERT (*RecordTmp
== 1);
85 RecordTmp
= (UINT8
*)Record
+ Offset
;
87 // Check protocol identifier.
89 if (*RecordTmp
== MCHostInterfaceProtocolTypeRedfishOverIP
) {
91 RecordTmp
= (UINT8
*)Record
+ Offset
;
92 ProtocolLength
= *RecordTmp
;
95 RecordTmp
= (UINT8
*)Record
+ Offset
;
98 // This SMBIOS record is invalid, if the length of protocol specific data for
99 // Redfish Over IP protocol is wrong.
101 if ((*(RecordTmp
+ 90) + sizeof (REDFISH_OVER_IP_PROTOCOL_DATA
) - 1) != ProtocolLength
) {
102 return EFI_SECURITY_VIOLATION
;
105 Offset
+= ProtocolLength
;
107 // This SMBIOS record is invalid, if the length is smaller than the offset.
109 if (Offset
> mType42Record
->Hdr
.Length
) {
110 return EFI_SECURITY_VIOLATION
;
113 *ProtocolData
= (REDFISH_OVER_IP_PROTOCOL_DATA
*)RecordTmp
;
120 Status
= Smbios
->GetNext (Smbios
, &SmbiosHandle
, NULL
, &Record
, NULL
);
123 *ProtocolData
= NULL
;
124 return EFI_NOT_FOUND
;