Define the Manager for handling host bound commands

Since some of the host bound commands are valid only for
OpenPower systems, a manager is needed, which can handle
commands from OpenBmc common code and also OpenPower
implementations.

Change-Id: Icf6566e701921ecea4c8cff1c16e498385303396
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/host-cmd-utils.hpp b/host-cmd-utils.hpp
new file mode 100644
index 0000000..f564e2a
--- /dev/null
+++ b/host-cmd-utils.hpp
@@ -0,0 +1,49 @@
+#pragma once
+
+#include <unistd.h>
+#include <tuple>
+
+namespace phosphor
+{
+namespace host
+{
+namespace command
+{
+    /** @detail After sending SMS_ATN to the Host, Host comes down and
+     *          asks why an 'SMS_ATN` was sent.
+     *          BMC then sends 'There is a Message to be Read` as reponse.
+     *          Host then comes down asks for Message and the specified
+     *          commands and data would go as data conforming to IPMI spec.
+     *
+     *          Refer: 6.13.2 Send Message Command From System Interface
+     *          in IPMI V2.0 spec.
+     */
+
+    /** @brief IPMI command */
+    using IPMIcmd = uint8_t;
+
+    /** @brief Data associated with command */
+    using Data = uint8_t;
+
+    /** @brief <IPMI command, Data> to be sent as payload when Host asks for
+     *          the message that can be associated with the previous SMS_ATN
+     */
+    using IpmiCmdData = std::pair<IPMIcmd, Data>;
+
+    /** @detail Implementation specific callback function to be invoked
+     *          conveying the status of the executed command. Specific
+     *          implementations may then broadcast an agreed signal
+     */
+    using CallBack = std::function<void(IpmiCmdData, bool)>;
+
+    /** @detail Tuple encapsulating above 2 to enable using Manager by
+     *          different implementations. Users of Manager will supply
+     *          <Ipmi command, Data> along with the callback handler.
+     *          Manager will invoke the handler onveying the status of
+     *          the command.
+     */
+    using CommandHandler = std::tuple<IpmiCmdData, CallBack>;
+
+} // namespace command
+} // namespace host
+} // namespace phosphor