| Alexander Hansen | 40fb549 | 2025-10-28 17:56:12 +0100 | [diff] [blame^] | 1 | // SPDX-License-Identifier: Apache-2.0 | 
 | 2 | // SPDX-FileCopyrightText: Copyright 2019 IBM Corporation | 
 | 3 |  | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 4 | #include "pldm_interface.hpp" | 
 | 5 |  | 
 | 6 | #include <libpldm/base.h> | 
| Andrew Jeffery | 7cc55b5 | 2024-06-19 20:45:13 +0930 | [diff] [blame] | 7 | #include <libpldm/oem/ibm/file_io.h> | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 8 | #include <libpldm/transport.h> | 
 | 9 | #include <libpldm/transport/mctp-demux.h> | 
 | 10 | #include <poll.h> | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 11 | #include <unistd.h> | 
 | 12 |  | 
| Matt Spinler | 1b41886 | 2023-06-29 12:37:41 -0500 | [diff] [blame] | 13 | #include <phosphor-logging/lg2.hpp> | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 14 |  | 
| Patrick Williams | 2544b41 | 2022-10-04 08:41:06 -0500 | [diff] [blame] | 15 | #include <fstream> | 
 | 16 |  | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 17 | namespace openpower::pels | 
 | 18 | { | 
 | 19 |  | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 20 | using namespace sdeventplus; | 
 | 21 | using namespace sdeventplus::source; | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 22 | using TerminusID = uint8_t; | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 23 |  | 
 | 24 | constexpr auto eidPath = "/usr/share/pldm/host_eid"; | 
 | 25 | constexpr mctp_eid_t defaultEIDValue = 9; | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 26 | constexpr TerminusID tid = defaultEIDValue; | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 27 |  | 
 | 28 | constexpr uint16_t pelFileType = 0; | 
 | 29 |  | 
 | 30 | PLDMInterface::~PLDMInterface() | 
 | 31 | { | 
| Patrick Williams | 49bcbe9 | 2024-06-26 23:06:54 -0500 | [diff] [blame] | 32 |     freeIID(); | 
 | 33 |     pldm_instance_db_destroy(_pldm_idb); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 34 |     closeFD(); | 
 | 35 | } | 
 | 36 |  | 
 | 37 | void PLDMInterface::closeFD() | 
 | 38 | { | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 39 |     pldm_transport_mctp_demux_destroy(mctpDemux); | 
 | 40 |     mctpDemux = nullptr; | 
 | 41 |     _fd = -1; | 
 | 42 |     pldmTransport = nullptr; | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 43 | } | 
 | 44 |  | 
 | 45 | void PLDMInterface::readEID() | 
 | 46 | { | 
 | 47 |     _eid = defaultEIDValue; | 
 | 48 |  | 
 | 49 |     std::ifstream eidFile{eidPath}; | 
 | 50 |     if (!eidFile.good()) | 
 | 51 |     { | 
| Matt Spinler | 1b41886 | 2023-06-29 12:37:41 -0500 | [diff] [blame] | 52 |         lg2::error("Could not open host EID file"); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 53 |     } | 
 | 54 |     else | 
 | 55 |     { | 
 | 56 |         std::string eid; | 
 | 57 |         eidFile >> eid; | 
 | 58 |         if (!eid.empty()) | 
 | 59 |         { | 
 | 60 |             _eid = atoi(eid.c_str()); | 
 | 61 |         } | 
 | 62 |         else | 
 | 63 |         { | 
| Matt Spinler | 1b41886 | 2023-06-29 12:37:41 -0500 | [diff] [blame] | 64 |             lg2::error("EID file was empty"); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 65 |         } | 
 | 66 |     } | 
 | 67 | } | 
 | 68 |  | 
 | 69 | void PLDMInterface::open() | 
 | 70 | { | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 71 |     if (pldmTransport) | 
 | 72 |     { | 
 | 73 |         lg2::error("open: pldmTransport already setup!"); | 
 | 74 |         throw std::runtime_error{"open failed"}; | 
 | 75 |     } | 
 | 76 |  | 
 | 77 |     _fd = openMctpDemuxTransport(); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 78 |     if (_fd < 0) | 
 | 79 |     { | 
 | 80 |         auto e = errno; | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 81 |         lg2::error("Transport open failed. errno = {ERRNO}, rc = {RC}", "ERRNO", | 
 | 82 |                    e, "RC", _fd); | 
 | 83 |         throw std::runtime_error{"Transport open failed"}; | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 84 |     } | 
 | 85 | } | 
 | 86 |  | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 87 | int PLDMInterface::openMctpDemuxTransport() | 
 | 88 | { | 
 | 89 |     int rc = pldm_transport_mctp_demux_init(&mctpDemux); | 
 | 90 |     if (rc) | 
 | 91 |     { | 
 | 92 |         lg2::error( | 
 | 93 |             "openMctpDemuxTransport: Failed to init MCTP demux transport. rc = {RC}", | 
 | 94 |             "RC", rc); | 
 | 95 |         return rc; | 
 | 96 |     } | 
 | 97 |  | 
 | 98 |     rc = pldm_transport_mctp_demux_map_tid(mctpDemux, tid, tid); | 
 | 99 |     if (rc) | 
 | 100 |     { | 
 | 101 |         lg2::error( | 
 | 102 |             "openMctpDemuxTransport: Failed to setup tid to eid mapping. rc = {RC}", | 
 | 103 |             "RC", rc); | 
 | 104 |         cleanupCmd(); | 
 | 105 |         return rc; | 
 | 106 |     } | 
 | 107 |     pldmTransport = pldm_transport_mctp_demux_core(mctpDemux); | 
 | 108 |  | 
 | 109 |     struct pollfd pollfd; | 
 | 110 |     rc = pldm_transport_mctp_demux_init_pollfd(pldmTransport, &pollfd); | 
 | 111 |     if (rc) | 
 | 112 |     { | 
 | 113 |         lg2::error("openMctpDemuxTransport: Failed to get pollfd. rc = {RC}", | 
 | 114 |                    "RC", rc); | 
 | 115 |         cleanupCmd(); | 
 | 116 |         return rc; | 
 | 117 |     } | 
 | 118 |     return pollfd.fd; | 
 | 119 | } | 
 | 120 |  | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 121 | void PLDMInterface::startCommand() | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 122 | { | 
 | 123 |     try | 
 | 124 |     { | 
 | 125 |         closeFD(); | 
 | 126 |  | 
 | 127 |         open(); | 
 | 128 |  | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 129 |         registerReceiveCallback(); | 
 | 130 |  | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 131 |         doSend(); | 
 | 132 |  | 
 | 133 |         _receiveTimer.restartOnce(_receiveTimeout); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 134 |     } | 
 | 135 |     catch (const std::exception& e) | 
 | 136 |     { | 
| Matt Spinler | 527ff34 | 2023-06-29 12:52:34 -0500 | [diff] [blame] | 137 |         lg2::error("startCommand exception: {ERROR}", "ERROR", e); | 
 | 138 |  | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 139 |         cleanupCmd(); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 140 |  | 
| Matt Spinler | 527ff34 | 2023-06-29 12:52:34 -0500 | [diff] [blame] | 141 |         throw; | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 142 |     } | 
 | 143 | } | 
 | 144 |  | 
| Patrick Williams | 49bcbe9 | 2024-06-26 23:06:54 -0500 | [diff] [blame] | 145 | void PLDMInterface::allocIID() | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 146 | { | 
| Patrick Williams | 49bcbe9 | 2024-06-26 23:06:54 -0500 | [diff] [blame] | 147 |     if (_instanceID) | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 148 |     { | 
| Patrick Williams | 49bcbe9 | 2024-06-26 23:06:54 -0500 | [diff] [blame] | 149 |         return; | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 150 |     } | 
| Patrick Williams | 49bcbe9 | 2024-06-26 23:06:54 -0500 | [diff] [blame] | 151 |  | 
 | 152 |     pldm_instance_id_t iid = 0; | 
 | 153 |     auto rc = pldm_instance_id_alloc(_pldm_idb, _eid, &iid); | 
 | 154 |  | 
 | 155 |     if (rc == -EAGAIN) | 
 | 156 |     { | 
 | 157 |         throw std::runtime_error("No free instance ids"); | 
 | 158 |     } | 
 | 159 |     else if (rc) | 
 | 160 |     { | 
 | 161 |         throw std::system_category().default_error_condition(rc); | 
 | 162 |     } | 
 | 163 |  | 
 | 164 |     _instanceID = iid; | 
 | 165 | } | 
 | 166 |  | 
 | 167 | void PLDMInterface::freeIID() | 
 | 168 | { | 
 | 169 |     if (!_instanceID) | 
 | 170 |     { | 
 | 171 |         return; | 
 | 172 |     } | 
 | 173 |  | 
 | 174 |     auto rc = pldm_instance_id_free(_pldm_idb, _eid, *_instanceID); | 
 | 175 |  | 
 | 176 |     if (rc == -EINVAL) | 
 | 177 |     { | 
| Patrick Williams | 075c792 | 2024-08-16 15:19:49 -0400 | [diff] [blame] | 178 |         throw std::runtime_error( | 
 | 179 |             "Instance ID " + std::to_string(*_instanceID) + " for TID " + | 
 | 180 |             std::to_string(_eid) + " was not previously allocated"); | 
| Patrick Williams | 49bcbe9 | 2024-06-26 23:06:54 -0500 | [diff] [blame] | 181 |     } | 
 | 182 |     else if (rc) | 
 | 183 |     { | 
 | 184 |         throw std::system_category().default_error_condition(rc); | 
 | 185 |     } | 
 | 186 |  | 
 | 187 |     _instanceID = std::nullopt; | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 188 | } | 
 | 189 |  | 
 | 190 | CmdStatus PLDMInterface::sendNewLogCmd(uint32_t id, uint32_t size) | 
 | 191 | { | 
 | 192 |     _pelID = id; | 
 | 193 |     _pelSize = size; | 
 | 194 |     _inProgress = true; | 
 | 195 |  | 
 | 196 |     try | 
 | 197 |     { | 
| Patrick Williams | 49bcbe9 | 2024-06-26 23:06:54 -0500 | [diff] [blame] | 198 |         // Allocate the instance ID, as needed. | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 199 |         if (!_instanceID) | 
 | 200 |         { | 
| Patrick Williams | 49bcbe9 | 2024-06-26 23:06:54 -0500 | [diff] [blame] | 201 |             allocIID(); | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 202 |         } | 
| Patrick Williams | 49bcbe9 | 2024-06-26 23:06:54 -0500 | [diff] [blame] | 203 |         startCommand(); | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 204 |     } | 
 | 205 |     catch (const std::exception& e) | 
 | 206 |     { | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 207 |         _inProgress = false; | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 208 |         return CmdStatus::failure; | 
 | 209 |     } | 
 | 210 |  | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 211 |     return CmdStatus::success; | 
 | 212 | } | 
 | 213 |  | 
 | 214 | void PLDMInterface::registerReceiveCallback() | 
 | 215 | { | 
 | 216 |     _source = std::make_unique<IO>( | 
 | 217 |         _event, _fd, EPOLLIN, | 
 | 218 |         std::bind(std::mem_fn(&PLDMInterface::receive), this, | 
 | 219 |                   std::placeholders::_1, std::placeholders::_2, | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 220 |                   std::placeholders::_3, pldmTransport)); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 221 | } | 
 | 222 |  | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 223 | void PLDMInterface::doSend() | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 224 | { | 
 | 225 |     std::array<uint8_t, sizeof(pldm_msg_hdr) + sizeof(pelFileType) + | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 226 |                             sizeof(_pelID) + sizeof(uint64_t)> | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 227 |         requestMsg; | 
 | 228 |  | 
 | 229 |     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data()); | 
 | 230 |  | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 231 |     auto rc = encode_new_file_req(*_instanceID, pelFileType, _pelID, _pelSize, | 
 | 232 |                                   request); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 233 |     if (rc != PLDM_SUCCESS) | 
 | 234 |     { | 
| Matt Spinler | 1b41886 | 2023-06-29 12:37:41 -0500 | [diff] [blame] | 235 |         lg2::error("encode_new_file_req failed, rc = {RC}", "RC", rc); | 
| Matt Spinler | 527ff34 | 2023-06-29 12:52:34 -0500 | [diff] [blame] | 236 |         throw std::runtime_error{"encode_new_file_req failed"}; | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 237 |     } | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 238 |     pldm_tid_t pldmTID = static_cast<pldm_tid_t>(_eid); | 
 | 239 |     rc = pldm_transport_send_msg(pldmTransport, pldmTID, requestMsg.data(), | 
 | 240 |                                  requestMsg.size()); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 241 |     if (rc < 0) | 
 | 242 |     { | 
 | 243 |         auto e = errno; | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 244 |         lg2::error("pldm_transport_send_msg failed, rc = {RC}, errno = {ERRNO}", | 
 | 245 |                    "RC", rc, "ERRNO", e); | 
 | 246 |         throw std::runtime_error{"pldm_transport_send_msg failed"}; | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 247 |     } | 
| Matt Spinler | 9fdcad5 | 2025-02-07 10:12:43 -0600 | [diff] [blame] | 248 |  | 
 | 249 |     memcpy(&_requestHeader, request, sizeof(pldm_msg_hdr)); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 250 | } | 
 | 251 |  | 
| Matt Spinler | f045e83 | 2025-03-13 11:07:10 -0500 | [diff] [blame] | 252 | struct Response | 
 | 253 | { | 
 | 254 |     Response(void* r) : response(r) {} | 
 | 255 |     ~Response() | 
 | 256 |     { | 
 | 257 |         if (response != nullptr) | 
 | 258 |         { | 
 | 259 |             free(response); | 
 | 260 |         } | 
 | 261 |     } | 
 | 262 |     void* response = nullptr; | 
 | 263 | }; | 
 | 264 |  | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 265 | void PLDMInterface::receive(IO& /*io*/, int /*fd*/, uint32_t revents, | 
 | 266 |                             pldm_transport* transport) | 
 | 267 |  | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 268 | { | 
 | 269 |     if (!(revents & EPOLLIN)) | 
 | 270 |     { | 
 | 271 |         return; | 
 | 272 |     } | 
 | 273 |  | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 274 |     void* responseMsg = nullptr; | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 275 |     size_t responseSize = 0; | 
 | 276 |     ResponseStatus status = ResponseStatus::success; | 
 | 277 |  | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 278 |     pldm_tid_t pldmTID; | 
 | 279 |     auto rc = pldm_transport_recv_msg(transport, &pldmTID, &responseMsg, | 
 | 280 |                                       &responseSize); | 
| Eddie James | ec6f141 | 2024-10-17 10:55:55 -0500 | [diff] [blame] | 281 |     struct pldm_msg_hdr* hdr = (struct pldm_msg_hdr*)responseMsg; | 
| Matt Spinler | f045e83 | 2025-03-13 11:07:10 -0500 | [diff] [blame] | 282 |     Response r{responseMsg}; | 
 | 283 |  | 
 | 284 |     if (rc == PLDM_REQUESTER_SUCCESS) | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 285 |     { | 
| Matt Spinler | f045e83 | 2025-03-13 11:07:10 -0500 | [diff] [blame] | 286 |         if ((pldmTID != _eid) || | 
 | 287 |             !pldm_msg_hdr_correlate_response(&_requestHeader, hdr)) | 
 | 288 |         { | 
 | 289 |             // We got a response to someone else's message. Ignore it. | 
 | 290 |             return; | 
 | 291 |         } | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 292 |     } | 
| Matt Spinler | f045e83 | 2025-03-13 11:07:10 -0500 | [diff] [blame] | 293 |     else | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 294 |     { | 
 | 295 |         if (rc == PLDM_REQUESTER_NOT_RESP_MSG) | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 296 |         { | 
 | 297 |             // Due to the MCTP loopback, we may get notified of the message | 
 | 298 |             // we just sent. | 
 | 299 |             return; | 
 | 300 |         } | 
 | 301 |  | 
 | 302 |         auto e = errno; | 
| Lakshmi Yadlapati | 0387a74 | 2024-07-01 17:04:37 -0500 | [diff] [blame] | 303 |         lg2::error("pldm_transport_recv_msg failed, rc = {RC}, errno = {ERRNO}", | 
 | 304 |                    "RC", | 
| Matt Spinler | 1b41886 | 2023-06-29 12:37:41 -0500 | [diff] [blame] | 305 |                    static_cast<std::underlying_type_t<pldm_requester_rc_t>>(rc), | 
 | 306 |                    "ERRNO", e); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 307 |         status = ResponseStatus::failure; | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 308 |     } | 
| Eddie James | ec6f141 | 2024-10-17 10:55:55 -0500 | [diff] [blame] | 309 |     if (hdr && (hdr->request || hdr->datagram)) | 
 | 310 |     { | 
| Eddie James | ec6f141 | 2024-10-17 10:55:55 -0500 | [diff] [blame] | 311 |         return; | 
 | 312 |     } | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 313 |  | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 314 |     cleanupCmd(); | 
 | 315 |  | 
 | 316 |     // Can't use this instance ID anymore. | 
| Patrick Williams | 49bcbe9 | 2024-06-26 23:06:54 -0500 | [diff] [blame] | 317 |     freeIID(); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 318 |  | 
 | 319 |     if (status == ResponseStatus::success) | 
 | 320 |     { | 
 | 321 |         uint8_t completionCode = 0; | 
 | 322 |         auto response = reinterpret_cast<pldm_msg*>(responseMsg); | 
 | 323 |  | 
| Patrick Williams | 075c792 | 2024-08-16 15:19:49 -0400 | [diff] [blame] | 324 |         auto decodeRC = | 
 | 325 |             decode_new_file_resp(response, responseSize, &completionCode); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 326 |         if (decodeRC < 0) | 
 | 327 |         { | 
| Matt Spinler | 1b41886 | 2023-06-29 12:37:41 -0500 | [diff] [blame] | 328 |             lg2::error("decode_new_file_resp failed, rc = {RC}", "RC", | 
 | 329 |                        decodeRC); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 330 |             status = ResponseStatus::failure; | 
 | 331 |         } | 
 | 332 |         else | 
 | 333 |         { | 
 | 334 |             if (completionCode != PLDM_SUCCESS) | 
 | 335 |             { | 
| Matt Spinler | 1b41886 | 2023-06-29 12:37:41 -0500 | [diff] [blame] | 336 |                 lg2::error("Bad PLDM completion code {CODE}", "CODE", | 
 | 337 |                            completionCode); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 338 |                 status = ResponseStatus::failure; | 
 | 339 |             } | 
 | 340 |         } | 
 | 341 |     } | 
 | 342 |  | 
| Matt Spinler | a44efe4 | 2020-03-03 10:30:16 -0600 | [diff] [blame] | 343 |     callResponseFunc(status); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 344 | } | 
 | 345 |  | 
 | 346 | void PLDMInterface::receiveTimerExpired() | 
 | 347 | { | 
| Matt Spinler | 1b41886 | 2023-06-29 12:37:41 -0500 | [diff] [blame] | 348 |     lg2::error("Timed out waiting for PLDM response"); | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 349 |  | 
 | 350 |     // Cleanup, but keep the instance ID because the host didn't | 
 | 351 |     // respond so we can still use it. | 
 | 352 |     cleanupCmd(); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 353 |  | 
| Matt Spinler | a44efe4 | 2020-03-03 10:30:16 -0600 | [diff] [blame] | 354 |     callResponseFunc(ResponseStatus::failure); | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 355 | } | 
 | 356 |  | 
 | 357 | void PLDMInterface::cancelCmd() | 
 | 358 | { | 
| Patrick Williams | 49bcbe9 | 2024-06-26 23:06:54 -0500 | [diff] [blame] | 359 |     freeIID(); | 
| Matt Spinler | 2843ba2 | 2020-03-03 16:36:32 -0600 | [diff] [blame] | 360 |     cleanupCmd(); | 
 | 361 | } | 
 | 362 |  | 
 | 363 | void PLDMInterface::cleanupCmd() | 
 | 364 | { | 
| Matt Spinler | 5c350fd | 2019-12-12 13:53:53 -0600 | [diff] [blame] | 365 |     _inProgress = false; | 
 | 366 |     _source.reset(); | 
 | 367 |  | 
 | 368 |     if (_receiveTimer.isEnabled()) | 
 | 369 |     { | 
 | 370 |         _receiveTimer.setEnabled(false); | 
 | 371 |     } | 
 | 372 |  | 
 | 373 |     closeFD(); | 
 | 374 | } | 
 | 375 |  | 
 | 376 | } // namespace openpower::pels |