#pragma once #include "common/instance_id.hpp" #include "xyz/openbmc_project/Common/error.hpp" #include "xyz/openbmc_project/PLDM/Requester/server.hpp" #include #include #include namespace pldm { namespace dbus_api { using RequesterIntf = sdbusplus::server::object_t< sdbusplus::xyz::openbmc_project::PLDM::server::Requester>; /** @class Requester * @brief OpenBMC PLDM.Requester implementation. * @details A concrete implementation for the * xyz.openbmc_project.PLDM.Requester DBus APIs. */ class Requester : public RequesterIntf { public: Requester() = delete; Requester(const Requester&) = delete; Requester& operator=(const Requester&) = delete; Requester(Requester&&) = delete; Requester& operator=(Requester&&) = delete; virtual ~Requester() = default; /** @brief Constructor to put object onto bus at a dbus path. * @param[in] bus - Bus to attach to. * @param[in] path - Path to attach at. * @param[in] db - The database to use for allocating instance IDs * @note will throw TooManyResources() if there were no free instance IDs * Throws std::system_category().default_error_condition if there is * something wrong with the instance ID database. */ Requester(sdbusplus::bus_t& bus, const std::string& path, InstanceIdDb& db) : RequesterIntf(bus, path.c_str()), pldmInstanceIdDb(db) {}; /** @brief Implementation for RequesterIntf.GetInstanceId */ uint8_t getInstanceId(uint8_t eid) override { int id; // Ideally we would be able to look up the TID for a given EID. We don't // have that infrastructure in place yet. So use the EID value for the // TID. This is an interim step towards the PLDM requester logic moving // into libpldm, and eventually this won't be needed. try { id = pldmInstanceIdDb.next(eid); } catch (const std::runtime_error& e) { throw sdbusplus::xyz::openbmc_project::Common::Error:: TooManyResources(); } return id; } /** @brief Mark an instance id as unused * @param[in] eid - MCTP eid to which this instance id belongs * @param[in] instanceId - PLDM instance id to be freed * @note will throw std::runtime_error if the instance ID was not * previously allocated. * Throws std::system_category().default_error_condition if there is * something wrong with the instance ID database. */ void markFree(uint8_t eid, uint8_t instanceId) { pldmInstanceIdDb.free(eid, instanceId); } private: InstanceIdDb& pldmInstanceIdDb; }; } // namespace dbus_api } // namespace pldm