blob: 52769abea9e6b85ab5025aa9986d13d547a08274 [file] [log] [blame]
Sampa Misraaea5dde2020-08-31 08:33:47 -05001#pragma once
Varsha Kaverappabb585b22020-09-10 06:15:42 -05002
Manojkiran Edaa31ceb92021-07-22 09:19:02 +05303#include "collect_slot_vpd.hpp"
4#include "common/utils.hpp"
Sampa Misraaea5dde2020-08-31 08:33:47 -05005#include "inband_code_update.hpp"
6#include "libpldmresponder/oem_handler.hpp"
Varsha Kaverappabb585b22020-09-10 06:15:42 -05007#include "libpldmresponder/pdr_utils.hpp"
Sampa Misraaea5dde2020-08-31 08:33:47 -05008#include "libpldmresponder/platform.hpp"
Sampa Misrac0c79482021-06-02 08:01:54 -05009#include "requester/handler.hpp"
Sampa Misraaea5dde2020-08-31 08:33:47 -050010
George Liuc453e162022-12-21 17:16:23 +080011#include <libpldm/entity.h>
Andrew Jeffery21f128d2024-01-15 15:34:26 +103012#include <libpldm/oem/ibm/state_set.h>
George Liuc453e162022-12-21 17:16:23 +080013#include <libpldm/platform.h>
George Liuc453e162022-12-21 17:16:23 +080014
Sagar Srinivas18145f72022-04-11 07:38:26 -050015#include <sdbusplus/bus/match.hpp>
16#include <sdeventplus/event.hpp>
17#include <sdeventplus/utility/timer.hpp>
18
Christian Geddes7f9523c2021-08-03 13:44:38 -050019typedef ibm_oem_pldm_state_set_firmware_update_state_values CodeUpdateState;
20
Sampa Misraaea5dde2020-08-31 08:33:47 -050021namespace pldm
22{
Sampa Misraaea5dde2020-08-31 08:33:47 -050023namespace responder
24{
Manojkiran Edaa31ceb92021-07-22 09:19:02 +053025using ObjectPath = std::string;
26using AssociatedEntityMap = std::map<ObjectPath, pldm_entity>;
Sampa Misraaea5dde2020-08-31 08:33:47 -050027namespace oem_ibm_platform
28{
Archana Kakanie26d13f2025-03-09 23:17:46 -050029using AttributeName = std::string;
30using AttributeType = std::string;
31using ReadonlyStatus = bool;
32using DisplayName = std::string;
33using Description = std::string;
34using MenuPath = std::string;
35using CurrentValue = std::variant<int64_t, std::string>;
36using DefaultValue = std::variant<int64_t, std::string>;
37using OptionString = std::string;
38using OptionValue = std::variant<int64_t, std::string>;
39using Option = std::vector<std::tuple<OptionString, OptionValue>>;
40using BIOSTableObj =
41 std::tuple<AttributeType, ReadonlyStatus, DisplayName, Description,
42 MenuPath, CurrentValue, DefaultValue, Option>;
43using BaseBIOSTable = std::map<AttributeName, BIOSTableObj>;
44using PendingObj = std::tuple<AttributeType, CurrentValue>;
45using PendingAttributes = std::map<AttributeName, PendingObj>;
46
Sagar Srinivas78a225a2020-08-27 00:52:20 -050047constexpr uint16_t ENTITY_INSTANCE_0 = 0;
48constexpr uint16_t ENTITY_INSTANCE_1 = 1;
49
Sagar Srinivas3687e2b2023-04-10 05:08:28 -050050constexpr uint32_t BMC_PDR_START_RANGE = 0x00000000;
51constexpr uint32_t BMC_PDR_END_RANGE = 0x00FFFFFF;
52constexpr uint32_t HOST_PDR_START_RANGE = 0x01000000;
53constexpr uint32_t HOST_PDR_END_RANGE = 0x01FFFFFF;
54
Sagar Srinivas18145f72022-04-11 07:38:26 -050055const pldm::pdr::TerminusID HYPERVISOR_TID = 208;
56
57static constexpr uint8_t HEARTBEAT_TIMEOUT_DELTA = 10;
58
Sagar Srinivas7f760b32021-05-12 07:46:56 -050059enum SetEventReceiverCount
60{
61 SET_EVENT_RECEIVER_SENT = 0x2,
62};
63
Sampa Misraaea5dde2020-08-31 08:33:47 -050064class Handler : public oem_platform::Handler
65{
66 public:
67 Handler(const pldm::utils::DBusHandler* dBusIntf,
Manojkiran Edaa31ceb92021-07-22 09:19:02 +053068 pldm::responder::CodeUpdate* codeUpdate,
69 pldm::responder::SlotHandler* slotHandler, int mctp_fd,
Andrew Jefferya330b2f2023-05-04 14:55:37 +093070 uint8_t mctp_eid, pldm::InstanceIdDb& instanceIdDb,
Brad Bishop5079ac42021-08-19 18:35:06 -040071 sdeventplus::Event& event,
Sampa Misrac0c79482021-06-02 08:01:54 -050072 pldm::requester::Handler<pldm::requester::Request>* handler) :
Patrick Williams16c2a0a2024-08-16 15:20:59 -040073 oem_platform::Handler(dBusIntf), codeUpdate(codeUpdate),
Manojkiran Edaa31ceb92021-07-22 09:19:02 +053074 slotHandler(slotHandler), platformHandler(nullptr), mctp_fd(mctp_fd),
75 mctp_eid(mctp_eid), instanceIdDb(instanceIdDb), event(event),
76 handler(handler),
Sagar Srinivas18145f72022-04-11 07:38:26 -050077 timer(event, std::bind(std::mem_fn(&Handler::setSurvTimer), this,
78 HYPERVISOR_TID, false)),
79 hostTransitioningToOff(true)
Sampa Misraaea5dde2020-08-31 08:33:47 -050080 {
81 codeUpdate->setVersions();
Sagar Srinivas7f760b32021-05-12 07:46:56 -050082 setEventReceiverCnt = 0;
83
84 using namespace sdbusplus::bus::match::rules;
Patrick Williams84b790c2022-07-22 19:26:56 -050085 hostOffMatch = std::make_unique<sdbusplus::bus::match_t>(
Sagar Srinivas7f760b32021-05-12 07:46:56 -050086 pldm::utils::DBusHandler::getBus(),
87 propertiesChanged("/xyz/openbmc_project/state/host0",
88 "xyz.openbmc_project.State.Host"),
Patrick Williams84b790c2022-07-22 19:26:56 -050089 [this](sdbusplus::message_t& msg) {
Patrick Williams16c2a0a2024-08-16 15:20:59 -040090 pldm::utils::DbusChangedProps props{};
91 std::string intf;
92 msg.read(intf, props);
93 const auto itr = props.find("CurrentHostState");
94 if (itr != props.end())
Sagar Srinivas7f760b32021-05-12 07:46:56 -050095 {
Patrick Williams16c2a0a2024-08-16 15:20:59 -040096 pldm::utils::PropertyValue value = itr->second;
97 auto propVal = std::get<std::string>(value);
98 if (propVal ==
99 "xyz.openbmc_project.State.Host.HostState.Off")
100 {
101 hostOff = true;
102 setEventReceiverCnt = 0;
103 disableWatchDogTimer();
104 startStopTimer(false);
105 }
106 else if (propVal ==
107 "xyz.openbmc_project.State.Host.HostState.Running")
108 {
109 hostOff = false;
110 hostTransitioningToOff = false;
111 }
112 else if (
113 propVal ==
114 "xyz.openbmc_project.State.Host.HostState.TransitioningToOff")
115 {
116 hostTransitioningToOff = true;
117 }
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500118 }
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400119 });
Pavithra Barithaya0fd6a092024-05-31 08:24:27 -0500120
Patrick Williams4f152f92024-06-18 02:38:34 -0500121 powerStateOffMatch = std::make_unique<sdbusplus::bus::match_t>(
Pavithra Barithaya0fd6a092024-05-31 08:24:27 -0500122 pldm::utils::DBusHandler::getBus(),
123 propertiesChanged("/xyz/openbmc_project/state/chassis0",
124 "xyz.openbmc_project.State.Chassis"),
Archana Kakani50554252025-03-17 01:37:29 -0500125 [this](sdbusplus::message_t& msg) {
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400126 pldm::utils::DbusChangedProps props{};
127 std::string intf;
128 msg.read(intf, props);
129 const auto itr = props.find("CurrentPowerState");
130 if (itr != props.end())
Pavithra Barithaya0fd6a092024-05-31 08:24:27 -0500131 {
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400132 pldm::utils::PropertyValue value = itr->second;
133 auto propVal = std::get<std::string>(value);
134 if (propVal ==
135 "xyz.openbmc_project.State.Chassis.PowerState.Off")
Pavithra Barithaya0fd6a092024-05-31 08:24:27 -0500136 {
Archana Kakani50554252025-03-17 01:37:29 -0500137 handleBootTypesAtChassisOff();
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400138 static constexpr auto searchpath =
139 "/xyz/openbmc_project/inventory/system/chassis/motherboard";
140 int depth = 0;
141 std::vector<std::string> powerInterface = {
142 "xyz.openbmc_project.State.Decorator.PowerState"};
143 pldm::utils::GetSubTreeResponse response =
144 pldm::utils::DBusHandler().getSubtree(
145 searchpath, depth, powerInterface);
146 for (const auto& [objPath, serviceMap] : response)
Pavithra Barithaya0fd6a092024-05-31 08:24:27 -0500147 {
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400148 pldm::utils::DBusMapping dbusMapping{
149 objPath,
150 "xyz.openbmc_project.State.Decorator.PowerState",
151 "PowerState", "string"};
152 value =
153 "xyz.openbmc_project.State.Decorator.PowerState.State.Off";
154 try
155 {
156 pldm::utils::DBusHandler().setDbusProperty(
157 dbusMapping, value);
158 }
159 catch (const std::exception& e)
160 {
161 error(
162 "Unable to set the slot power state to Off error - {ERROR}",
163 "ERROR", e);
164 }
Pavithra Barithaya0fd6a092024-05-31 08:24:27 -0500165 }
166 }
167 }
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400168 });
Archana Kakanie26d13f2025-03-09 23:17:46 -0500169 updateBIOSMatch = std::make_unique<sdbusplus::bus::match_t>(
170 pldm::utils::DBusHandler::getBus(),
171 propertiesChanged("/xyz/openbmc_project/bios_config/manager",
172 "xyz.openbmc_project.BIOSConfig.Manager"),
173 [codeUpdate](sdbusplus::message_t& msg) {
174 constexpr auto propertyName = "PendingAttributes";
175 using Value =
176 std::variant<std::string, PendingAttributes, BaseBIOSTable>;
177 using Properties = std::map<pldm::utils::DbusProp, Value>;
178 Properties props{};
179 std::string intf;
180 msg.read(intf, props);
181 auto valPropMap = props.find(propertyName);
182 if (valPropMap == props.end())
183 {
184 return;
185 }
186
187 PendingAttributes pendingAttributes =
188 std::get<PendingAttributes>(valPropMap->second);
189 for (auto it : pendingAttributes)
190 {
191 if (it.first == "fw_boot_side")
192 {
193 auto& [attributeType, attributevalue] = it.second;
194 std::string nextBootSideAttr =
195 std::get<std::string>(attributevalue);
196 std::string nextBootSide =
197 (nextBootSideAttr == "Perm" ? Pside : Tside);
198 codeUpdate->setNextBootSide(nextBootSide);
199 }
200 }
201 });
Sampa Misraaea5dde2020-08-31 08:33:47 -0500202 }
203
204 int getOemStateSensorReadingsHandler(
Kamalkumar Patel7d427f12024-05-16 03:44:00 -0500205 pldm::pdr::EntityType entityType,
206 pldm::pdr::EntityInstance entityInstance,
Manojkiran Edaa31ceb92021-07-22 09:19:02 +0530207 pldm::pdr::ContainerID containerId, pldm::pdr::StateSetId stateSetId,
208 pldm::pdr::CompositeCount compSensorCnt, uint16_t sensorId,
Sampa Misraaea5dde2020-08-31 08:33:47 -0500209 std::vector<get_sensor_state_field>& stateField);
210
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500211 int oemSetStateEffecterStatesHandler(
Varsha Kaverappa3fbd39e2020-09-28 01:40:22 -0500212 uint16_t entityType, uint16_t entityInstance, uint16_t stateSetId,
213 uint8_t compEffecterCnt,
214 std::vector<set_effecter_state_field>& stateField, uint16_t effecterId);
Sampa Misraaea5dde2020-08-31 08:33:47 -0500215
216 /** @brief Method to set the platform handler in the
217 * oem_ibm_handler class
218 * @param[in] handler - pointer to PLDM platform handler
219 */
220 void setPlatformHandler(pldm::responder::platform::Handler* handler);
221
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500222 /** @brief Method to fetch the effecter ID of the code update PDRs
223 *
224 * @return platformHandler->getNextEffecterId() - returns the
225 * effecter ID from the platform handler
226 */
Manojkiran Eda6b1d8832021-03-27 11:25:06 +0530227 virtual uint16_t getNextEffecterId()
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500228 {
229 return platformHandler->getNextEffecterId();
230 }
231
232 /** @brief Method to fetch the sensor ID of the code update PDRs
233 *
234 * @return platformHandler->getNextSensorId() - returns the
235 * Sensor ID from the platform handler
236 */
Manojkiran Eda6b1d8832021-03-27 11:25:06 +0530237 virtual uint16_t getNextSensorId()
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500238 {
239 return platformHandler->getNextSensorId();
240 }
241
Manojkiran Edaa31ceb92021-07-22 09:19:02 +0530242 /** @brief Get std::map associated with the entity
243 * key: object path
244 * value: pldm_entity
245 *
246 * @return std::map<ObjectPath, pldm_entity>
247 */
248 virtual const AssociatedEntityMap& getAssociateEntityMap()
249 {
250 return platformHandler->getAssociateEntityMap();
251 }
252
Sagar Srinivas78a225a2020-08-27 00:52:20 -0500253 /** @brief Method to Generate the OEM PDRs
254 *
255 * @param[in] repo - instance of concrete implementation of Repo
256 */
257 void buildOEMPDR(pdr_utils::Repo& repo);
258
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500259 /** @brief Method to send code update event to host
260 * @param[in] sensorId - sendor ID
261 * @param[in] sensorEventClass - event class of sensor
262 * @param[in] sensorOffset - sensor offset
263 * @param[in] eventState - new code update event state
264 * @param[in] prevEventState - previous code update event state
265 * @return none
266 */
267 void sendStateSensorEvent(uint16_t sensorId,
268 enum sensor_event_class_states sensorEventClass,
269 uint8_t sensorOffset, uint8_t eventState,
270 uint8_t prevEventState);
271
272 /** @brief Method to send encoded request msg of code update event to host
273 * @param[in] requestMsg - encoded request msg
Sampa Misrac0c79482021-06-02 08:01:54 -0500274 * @param[in] instanceId - instance id of the message
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500275 * @return PLDM status code
276 */
Sampa Misrac0c79482021-06-02 08:01:54 -0500277 int sendEventToHost(std::vector<uint8_t>& requestMsg, uint8_t instanceId);
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500278
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500279 /** @brief _processEndUpdate processes the actual work that needs
280 * to be carried out after EndUpdate effecter is set. This is done async
281 * after sending response for EndUpdate set effecter
282 * @param[in] source - sdeventplus event source
283 */
284 void _processEndUpdate(sdeventplus::source::EventBase& source);
285
286 /** @brief _processStartUpdate processes the actual work that needs
287 * to be carried out after StartUpdate effecter is set. This is done async
288 * after sending response for StartUpdate set effecter
289 * @param[in] source - sdeventplus event source
290 */
291 void _processStartUpdate(sdeventplus::source::EventBase& source);
292
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600293 /** @brief _processSystemReboot processes the actual work that needs to be
294 * carried out after the System Power State effecter is set to reboot
295 * the system
296 * @param[in] source - sdeventplus event source
297 */
298 void _processSystemReboot(sdeventplus::source::EventBase& source);
299
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500300 /*keeps track how many times setEventReceiver is sent */
301 void countSetEventReceiver()
302 {
303 setEventReceiverCnt++;
304 }
305
306 /* disables watchdog if running and Host is up */
307 void checkAndDisableWatchDog();
308
Sagar Srinivas79669c92021-04-28 15:43:30 -0500309 /** @brief To check if the watchdog app is running
310 *
311 * @return the running status of watchdog app
312 */
313 bool watchDogRunning();
314
315 /** @brief Method to reset the Watchdog timer on receiving platform Event
316 * Message for heartbeat elapsed time from Hostboot
317 */
318 void resetWatchDogTimer();
319
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500320 /** @brief To disable to the watchdog timer on host poweron completion*/
321 void disableWatchDogTimer();
322
Pavithra Barithaya99854a72021-09-29 06:58:11 -0500323 /** @brief to check the BMC state*/
324 int checkBMCState();
325
Kamalkumar Patel15ce5a12024-05-07 11:45:11 -0500326 /** @brief update the dbus object paths */
327 void updateOemDbusPaths(std::string& dbusPath);
328
Sagar Srinivas3687e2b2023-04-10 05:08:28 -0500329 /** @brief Method to fetch the last BMC record from the PDR repo
330 *
331 * @param[in] repo - pointer to BMC's primary PDR repo
332 *
333 * @return the last BMC record from the repo
334 */
335 const pldm_pdr_record* fetchLastBMCRecord(const pldm_pdr* repo);
336
337 /** @brief Method to check if the record handle passed is in remote PDR
338 * record handle range
339 *
340 * @param[in] record_handle - record handle of the PDR
341 *
342 * @return true if record handle passed is in host PDR record handle range
343 */
344 bool checkRecordHandleInRange(const uint32_t& record_handle);
345
Sagar Srinivas90314a32023-10-17 10:38:03 -0500346 /** *brief Method to call the setEventReceiver command*/
347 void processSetEventReceiver();
348
349 /** @brief Method to call the setEventReceiver through the platform
350 * handler
351 */
352 virtual void setEventReceiver()
353 {
354 platformHandler->setEventReceiver();
355 }
356
Sagar Srinivas18145f72022-04-11 07:38:26 -0500357 /** @brief Method to Enable/Disable timer to see if remote terminus sends
358 * the surveillance ping and logs informational error if remote terminus
359 * fails to send the surveillance pings
360 *
361 * @param[in] tid - TID of the remote terminus
362 * @param[in] value - true or false, to indicate if the timer is
363 * running or not
364 */
365 void setSurvTimer(uint8_t tid, bool value);
366
Archana Kakani50554252025-03-17 01:37:29 -0500367 /** @brief To handle the boot types bios attributes at power on*/
368 void handleBootTypesAtPowerOn();
369
370 /** @brief To handle the boot types bios attributes at shutdown*/
371 void handleBootTypesAtChassisOff();
372
373 /** @brief To set the boot types bios attributes based on the RestartCause
374 * of host
375 *
376 * @param[in] RestartCause - Host restart cause
377 */
378 void setBootTypesBiosAttr(const std::string& restartCause);
379
Sampa Misraaea5dde2020-08-31 08:33:47 -0500380 ~Handler() = default;
381
382 pldm::responder::CodeUpdate* codeUpdate; //!< pointer to CodeUpdate object
Manojkiran Edaa31ceb92021-07-22 09:19:02 +0530383
384 pldm::responder::SlotHandler*
385 slotHandler; //!< pointer to SlotHandler object
386
Sampa Misraaea5dde2020-08-31 08:33:47 -0500387 pldm::responder::platform::Handler*
388 platformHandler; //!< pointer to PLDM platform handler
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500389
390 /** @brief fd of MCTP communications socket */
391 int mctp_fd;
392
393 /** @brief MCTP EID of host firmware */
394 uint8_t mctp_eid;
395
Andrew Jefferya330b2f2023-05-04 14:55:37 +0930396 /** @brief reference to an InstanceIdDb object, used to obtain a PLDM
397 * instance id. */
398 pldm::InstanceIdDb& instanceIdDb;
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500399 /** @brief sdeventplus event source */
400 std::unique_ptr<sdeventplus::source::Defer> assembleImageEvent;
401 std::unique_ptr<sdeventplus::source::Defer> startUpdateEvent;
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600402 std::unique_ptr<sdeventplus::source::Defer> systemRebootEvent;
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500403
Manojkiran Edaa31ceb92021-07-22 09:19:02 +0530404 /** @brief Effecterid to dbus object path map
405 */
406 std::unordered_map<uint16_t, std::string> effecterIdToDbusMap;
407
Sampa Misra3a0e3b92020-10-21 05:58:00 -0500408 /** @brief reference of main event loop of pldmd, primarily used to schedule
409 * work
410 */
411 sdeventplus::Event& event;
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600412
413 private:
Sagar Srinivas18145f72022-04-11 07:38:26 -0500414 /** @brief Method to reset or stop the surveillance timer
415 *
416 * @param[in] value - true or false, to indicate if the timer
417 * should be reset or turned off
418 */
419 void startStopTimer(bool value);
420
Sagar Srinivas9a64b4a2021-02-09 07:55:38 -0600421 /** @brief D-Bus property changed signal match for CurrentPowerState*/
Patrick Williams84b790c2022-07-22 19:26:56 -0500422 std::unique_ptr<sdbusplus::bus::match_t> chassisOffMatch;
Sampa Misrac0c79482021-06-02 08:01:54 -0500423
424 /** @brief PLDM request handler */
425 pldm::requester::Handler<pldm::requester::Request>* handler;
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500426
427 /** @brief D-Bus property changed signal match */
Archana Kakanie26d13f2025-03-09 23:17:46 -0500428 std::unique_ptr<sdbusplus::bus::match_t> updateBIOSMatch;
429
430 /** @brief D-Bus property changed signal match */
Patrick Williams84b790c2022-07-22 19:26:56 -0500431 std::unique_ptr<sdbusplus::bus::match_t> hostOffMatch;
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500432
Pavithra Barithaya0fd6a092024-05-31 08:24:27 -0500433 /** @brief D-Bus property changed signal match */
434 std::unique_ptr<sdbusplus::bus::match_t> powerStateOffMatch;
435
Sagar Srinivas18145f72022-04-11 07:38:26 -0500436 /** @brief Timer used for monitoring surveillance pings from host */
437 sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer;
438
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500439 bool hostOff = true;
440
Sagar Srinivas18145f72022-04-11 07:38:26 -0500441 bool hostTransitioningToOff;
442
Sagar Srinivas7f760b32021-05-12 07:46:56 -0500443 int setEventReceiverCnt = 0;
Sampa Misraaea5dde2020-08-31 08:33:47 -0500444};
445
Varsha Kaverappabb585b22020-09-10 06:15:42 -0500446/** @brief Method to encode code update event msg
447 * @param[in] eventType - type of event
448 * @param[in] eventDataVec - vector of event data to be sent to host
449 * @param[in/out] requestMsg - request msg to be encoded
450 * @param[in] instanceId - instance ID
451 * @return PLDM status code
452 */
453int encodeEventMsg(uint8_t eventType, const std::vector<uint8_t>& eventDataVec,
454 std::vector<uint8_t>& requestMsg, uint8_t instanceId);
455
Sampa Misraaea5dde2020-08-31 08:33:47 -0500456} // namespace oem_ibm_platform
457
458} // namespace responder
459
460} // namespace pldm