]> git.proxmox.com Git - mirror_edk2.git/blame - RedfishPkg/RedfishDiscoverDxe/RedfishSmbiosHostInterface.c
NetworkPkg/IScsiDxe: re-set session-level authentication state before login
[mirror_edk2.git] / RedfishPkg / RedfishDiscoverDxe / RedfishSmbiosHostInterface.c
CommitLineData
7e7b729f
AC
1/** @file\r
2 RedfishSmbiosHostInterface.c\r
3\r
4 Discover Redfish SMBIOS Host Interface.\r
5\r
6 (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>\r
7\r
8 SPDX-License-Identifier: BSD-2-Clause-Patent\r
9\r
10**/\r
11\r
12#include "RedfishDiscoverInternal.h"\r
13\r
14SMBIOS_TABLE_TYPE42 *mType42Record;\r
15\r
16/**\r
17 The function gets information reported in Redfish Host Interface.\r
18\r
19 It simply frees the packet.\r
20\r
21 @param[in] Smbios SMBIOS protocol.\r
22 @param[out] DeviceDescriptor Pointer to REDFISH_INTERFACE_DATA.\r
23 @param[out] ProtocolData Pointer to REDFISH_OVER_IP_PROTOCOL_DATA.\r
24\r
25 @retval EFI_SUCCESS Get host interface succesfully.\r
26 @retval Otherwise Fail to tet host interface.\r
27\r
28**/\r
29EFI_STATUS\r
30RedfishGetHostInterfaceProtocolData (\r
31 IN EFI_SMBIOS_PROTOCOL *Smbios,\r
32 OUT REDFISH_INTERFACE_DATA **DeviceDescriptor,\r
33 OUT REDFISH_OVER_IP_PROTOCOL_DATA **ProtocolData\r
34 )\r
35{\r
36 EFI_STATUS Status;\r
37 EFI_SMBIOS_HANDLE SmbiosHandle;\r
38 EFI_SMBIOS_TABLE_HEADER *Record;\r
39 UINT16 Offset;\r
40 UINT8 *RecordTmp;\r
41 UINT8 ProtocolLength;\r
42 UINT8 SpecificDataLen;\r
43\r
44 if ((Smbios == NULL) || (ProtocolData == NULL)) {\r
45 return EFI_INVALID_PARAMETER;\r
46 }\r
47\r
48 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
49 Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);\r
50 while (!EFI_ERROR (Status) && SmbiosHandle != SMBIOS_HANDLE_PI_RESERVED) {\r
51 if (Record->Type == SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE) {\r
52 //\r
53 // Check Interface Type, should be Network Host Interface = 40h\r
54 //\r
55 mType42Record = (SMBIOS_TABLE_TYPE42 *) Record;\r
56 if (mType42Record->InterfaceType == MCHostInterfaceTypeNetworkHostInterface) {\r
57 ASSERT (Record->Length >= 9);\r
58 Offset = 5;\r
59 RecordTmp = (UINT8 *) Record + Offset;\r
60 //\r
61 // Get interface specific data length.\r
62 //\r
63 SpecificDataLen = *RecordTmp;\r
64 Offset += 1;\r
65 RecordTmp = (UINT8 *) Record + Offset;\r
66\r
67 //\r
68 // Check Device Type, only PCI/PCIe Network Interface v2 is supported now.\r
69 //\r
70 if (*RecordTmp == REDFISH_HOST_INTERFACE_DEVICE_TYPE_PCI_PCIE_V2) {\r
71 ASSERT (SpecificDataLen == sizeof (PCI_OR_PCIE_INTERFACE_DEVICE_DESCRIPTOR_V2) + 1);\r
72 *DeviceDescriptor = (REDFISH_INTERFACE_DATA *)RecordTmp;\r
73 Offset = Offset + SpecificDataLen;\r
74 RecordTmp = (UINT8 *) Record + Offset;\r
75 //\r
76 // Check Protocol count. if > 1, only use the first protocol.\r
77 //\r
78 ASSERT (*RecordTmp == 1);\r
79 Offset += 1;\r
80 RecordTmp = (UINT8 *) Record + Offset;\r
81 //\r
82 // Check protocol identifier.\r
83 //\r
84 if (*RecordTmp == MCHostInterfaceProtocolTypeRedfishOverIP) {\r
85 Offset += 1;\r
86 RecordTmp = (UINT8 *) Record + Offset;\r
87 ProtocolLength = *RecordTmp;\r
88\r
89 Offset += 1;\r
90 RecordTmp = (UINT8 *) Record + Offset;\r
91\r
92 //\r
93 // This SMBIOS record is invalid, if the length of protocol specific data for\r
94 // Redfish Over IP protocol is wrong.\r
95 //\r
96 if ((*(RecordTmp + 90) + sizeof (REDFISH_OVER_IP_PROTOCOL_DATA) - 1) != ProtocolLength) {\r
97 return EFI_SECURITY_VIOLATION;\r
98 }\r
99\r
100 Offset += ProtocolLength;\r
101 //\r
102 // This SMBIOS record is invalid, if the length is smaller than the offset.\r
103 //\r
104 if (Offset > mType42Record->Hdr.Length) {\r
105 return EFI_SECURITY_VIOLATION;\r
106 }\r
107 *ProtocolData = (REDFISH_OVER_IP_PROTOCOL_DATA *)RecordTmp;\r
108 return EFI_SUCCESS;\r
109 }\r
110 }\r
111 }\r
112 }\r
113 Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);\r
114 }\r
115\r
116 *ProtocolData = NULL;\r
117 return EFI_NOT_FOUND;\r
118}\r