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