Make PLDM an optional feature for host dump offload

Host dumps are dumps which created and stored in the host
but offloaded through BMC.
With this change if the host dump needs to de downloaded
the transport mechanism also needs to be provided
    --with-host-dump-offload-transport=<transport>
for eg:
    --with-host-dump-offload-transport=pldm
If no options provided the phosphor-dump-manager will be built
with no host dump offload support and an exception will be thrown
if someone tried to call the host dump offload function.

Signed-off-by: Dhruvaraj Subhashchandran <dhruvaraj@in.ibm.com>
Change-Id: I27311427d8ca8b06b9f33ff5f42bdc7ca87fdcd1
diff --git a/Makefile.am b/Makefile.am
index bdd02d4..1c8c9ae 100755
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,8 +9,7 @@
 	dump_utils.hpp \
 	watch.hpp \
 	elog_watch.hpp \
-	dump_serialize.hpp \
-	pldm_interface.hpp
+	dump_serialize.hpp
 
 nobase_nodist_include_HEADERS = \
 	xyz/openbmc_project/Dump/Internal/Create/server.hpp
@@ -28,7 +27,6 @@
 	xyz/openbmc_project/Dump/Internal/Create/server.cpp \
 	elog_watch.cpp \
 	dump_serialize.cpp \
-	pldm_interface.cpp \
 	dump_utils.cpp \
         system_dump_entry.cpp
 
@@ -40,8 +38,7 @@
 phosphor_dump_manager_CXXFLAGS = \
 	$(PHOSPHOR_DBUS_INTERFACES_CFLAGS) \
 	$(SDBUSPLUS_CFLAGS) \
-	$(PHOSPHOR_LOGGING_CFLAGS) \
-	$(LIBPLDM_CFLAGS)
+	$(PHOSPHOR_LOGGING_CFLAGS)
 
 phosphor_dump_monitor_CXXFLAGS = \
 	$(PHOSPHOR_DBUS_INTERFACES_CFLAGS) \
@@ -51,14 +48,15 @@
 	$(PHOSPHOR_DBUS_INTERFACES_LIBS) \
 	$(SDBUSPLUS_LIBS) \
 	$(PHOSPHOR_LOGGING_LIBS) \
-	-lstdc++fs \
-	$(LIBPLDM_LIBS)
+	-lstdc++fs
 
 phosphor_dump_monitor_LDADD = \
 	$(PHOSPHOR_DBUS_INTERFACES_LIBS) \
 	$(PHOSPHOR_LOGGING_LIBS) \
 	-lstdc++fs
 
+include offload-extensions/extensions.mk
+
 # Be sure to build needed files before compiling
 BUILT_SOURCES = \
 	xyz/openbmc_project/Dump/Internal/Create/server.cpp \
diff --git a/configure.ac b/configure.ac
index 5a3eb3a..6051460 100755
--- a/configure.ac
+++ b/configure.ac
@@ -12,12 +12,23 @@
 AC_PROG_MKDIR_P
 AC_CHECK_PROG([DIRNAME], dirname, dirname)
 
+AC_ARG_WITH([host-dump-offload-transport],
+	[
+AS_HELP_STRING([--with-host-dump-offload-transport],
+		[To specify the host dump transport protocol])])
+
 # Check for libraries
 PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 221])
 PKG_CHECK_MODULES([PHOSPHOR_DBUS_INTERFACES], [phosphor-dbus-interfaces])
 PKG_CHECK_MODULES([SDBUSPLUS], [sdbusplus])
 PKG_CHECK_MODULES([PHOSPHOR_LOGGING], [phosphor-logging])
-PKG_CHECK_MODULES([LIBPLDM], [libpldm])
+
+AM_CONDITIONAL([DEFAULT_HOST_OFFLOAD], [test "x$with_host_dump_offload_transport" == "x"])
+AM_CONDITIONAL([ENABLE_PLDM_OFFLOAD], [test "$with_host_dump_offload_transport" == "pldm"])
+
+AS_IF([test "$with_host_dump_offload_transport" == "pldm"],
+    [AX_PKG_CHECK_MODULES([LIBPLDM], [libpldm])]
+)
 
 # Check for sdbus++
 AC_PATH_PROG([SDBUSPLUSPLUS], [sdbus++])
diff --git a/offload-extensions.hpp b/offload-extensions.hpp
new file mode 100644
index 0000000..3a1ab9c
--- /dev/null
+++ b/offload-extensions.hpp
@@ -0,0 +1,17 @@
+namespace phosphor
+{
+namespace dump
+{
+namespace host
+{
+
+/**
+ * @brief Initiate offload of the dump with provided id
+ *
+ * @param[in] id - The Dump Source ID.
+ *
+ */
+void requestOffload(uint32_t id);
+} // namespace host
+} // namespace dump
+} // namespace phosphor
diff --git a/offload-extensions/default/default.cpp b/offload-extensions/default/default.cpp
new file mode 100644
index 0000000..6a14fdc
--- /dev/null
+++ b/offload-extensions/default/default.cpp
@@ -0,0 +1,17 @@
+#include <cstdint>
+#include <stdexcept>
+
+namespace phosphor
+{
+namespace dump
+{
+namespace host
+{
+void requestOffload(uint32_t id)
+{
+    throw std::runtime_error("Hostdump offload method not specified");
+}
+
+} // namespace host
+} // namespace dump
+} // namespace phosphor
diff --git a/offload-extensions/default/default.mk b/offload-extensions/default/default.mk
new file mode 100644
index 0000000..5774fd5
--- /dev/null
+++ b/offload-extensions/default/default.mk
@@ -0,0 +1,2 @@
+phosphor_dump_manager_SOURCES += \
+       offload-extensions/default/default.cpp
diff --git a/offload-extensions/extensions.mk b/offload-extensions/extensions.mk
new file mode 100644
index 0000000..b663f62
--- /dev/null
+++ b/offload-extensions/extensions.mk
@@ -0,0 +1,7 @@
+if ENABLE_PLDM_OFFLOAD
+include offload-extensions/pldm/pldm.mk
+endif
+
+if DEFAULT_HOST_OFFLOAD
+include offload-extensions/default/default.mk
+endif
diff --git a/offload-extensions/pldm/pldm.mk b/offload-extensions/pldm/pldm.mk
new file mode 100644
index 0000000..c136fbb
--- /dev/null
+++ b/offload-extensions/pldm/pldm.mk
@@ -0,0 +1,12 @@
+noinst_HEADERS += \
+        offload-extensions/pldm/pldm_interface.hpp
+
+phosphor_dump_manager_LDADD += \
+	$(LIBPLDM_LIBS)
+
+phosphor_dump_manager_CXXFLAGS += \
+        $(LIBPLDM_CFLAGS)
+
+phosphor_dump_manager_SOURCES += \
+       offload-extensions/pldm/pldm_interface.cpp
+
diff --git a/pldm_interface.cpp b/offload-extensions/pldm/pldm_interface.cpp
similarity index 94%
rename from pldm_interface.cpp
rename to offload-extensions/pldm/pldm_interface.cpp
index 57d7a2c..dfff103 100644
--- a/pldm_interface.cpp
+++ b/offload-extensions/pldm/pldm_interface.cpp
@@ -31,6 +31,20 @@
 {
 namespace dump
 {
+namespace host
+{
+/**
+ * @brief Initiate offload of the dump with provided id
+ *
+ * @param[in] id - The Dump Source ID.
+ *
+ */
+void requestOffload(uint32_t id)
+{
+    pldm::requestOffload(id);
+}
+} // namespace host
+
 namespace pldm
 {
 
diff --git a/pldm_interface.hpp b/offload-extensions/pldm/pldm_interface.hpp
similarity index 100%
rename from pldm_interface.hpp
rename to offload-extensions/pldm/pldm_interface.hpp
diff --git a/system_dump_entry.cpp b/system_dump_entry.cpp
index 970be7d..53d8788 100644
--- a/system_dump_entry.cpp
+++ b/system_dump_entry.cpp
@@ -1,6 +1,6 @@
 #include "system_dump_entry.hpp"
 
-#include "pldm_interface.hpp"
+#include "offload-extensions.hpp"
 
 namespace phosphor
 {
@@ -8,12 +8,11 @@
 {
 namespace system
 {
-using namespace phosphor::dump::pldm;
 
 void Entry::initiateOffload(std::string uri)
 {
     phosphor::dump::Entry::initiateOffload(uri);
-    requestOffload(sourceDumpId());
+    phosphor::dump::host::requestOffload(sourceDumpId());
 }
 
 } // namespace system