pldmd: implement PLDM.Requester D-Bus API
Implement D-Bus API defined at
https://gerrit.openbmc-project.xyz/#/c/openbmc/phosphor-dbus-interfaces/+/27077/.
This commit provides an implementation of the PLDM instance id as per
DSP0240 v1.0.0. Ids are tracked per MCTP EID.
Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
Change-Id: I8a1ef213646529b71d9bf33edda67537f7c0f32a
diff --git a/dbus_impl_requester.hpp b/dbus_impl_requester.hpp
new file mode 100644
index 0000000..e892194
--- /dev/null
+++ b/dbus_impl_requester.hpp
@@ -0,0 +1,59 @@
+#pragma once
+
+#include "instance_id.hpp"
+#include "xyz/openbmc_project/PLDM/Requester/server.hpp"
+
+#include <map>
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server/object.hpp>
+
+namespace pldm
+{
+namespace dbus_api
+{
+
+using RequesterIntf = sdbusplus::server::object::object<
+ 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.
+ */
+ Requester(sdbusplus::bus::bus& bus, const std::string& path) :
+ RequesterIntf(bus, path.c_str()){};
+
+ /** @brief Implementation for RequesterIntf.GetInstanceId */
+ uint8_t getInstanceId(uint8_t eid) override;
+
+ /** @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::out_of_range if instanceId > 31
+ */
+ void markFree(uint8_t eid, uint8_t instanceId)
+ {
+ ids[eid].markFree(instanceId);
+ }
+
+ private:
+ /** @brief EID to PLDM Instance ID map */
+ std::map<uint8_t, InstanceId> ids;
+};
+
+} // namespace dbus_api
+} // namespace pldm