summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Joseph <tomjoseph@in.ibm.com>2017-04-03 01:53:44 +0530
committerPatrick Williams <patrick@stwcx.xyz>2017-04-25 19:12:26 +0000
commit64b3dec812821351dbf75bf8c73c5d7f0cb0fe98 (patch)
tree09cc81858337895208fde4c36678a481ab8442ab
parent04b303819eace72df588da0db951ac6ed2cb0b52 (diff)
downloadphosphor-net-ipmid-64b3dec812821351dbf75bf8c73c5d7f0cb0fe98.tar.gz
phosphor-net-ipmid-64b3dec812821351dbf75bf8c73c5d7f0cb0fe98.zip
Add handler function for incoming SOL payload.
Change-Id: I1bdff462ef43281332c6b8c2d61028bc0d9f87b0 Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
-rw-r--r--Makefile.am4
-rw-r--r--command/sol_cmds.cpp52
-rw-r--r--command/sol_cmds.hpp27
3 files changed, 82 insertions, 1 deletions
diff --git a/Makefile.am b/Makefile.am
index 35e5353..ad42d8d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -46,7 +46,9 @@ netipmid_SOURCES = \
sol/sol_manager.hpp \
sd_event_loop.cpp \
sol/sol_manager.cpp \
- sol/sol_context.cpp
+ sol/sol_context.cpp \
+ command/sol_cmds.hpp \
+ command/sol_cmds.cpp
netipmid_CPPFLAGS = -DNET_IPMID_LIB_PATH=\"/usr/lib/net-ipmid/\"
netipmid_LDFLAGS = $(SYSTEMD_LIBS) $(CRYPTO_LIBS) $(libmapper_LIBS) $(PHOSPHOR_LOGGING_LIBS) $(LIBADD_DLOPEN) -export-dynamic
diff --git a/command/sol_cmds.cpp b/command/sol_cmds.cpp
new file mode 100644
index 0000000..8f5b0c6
--- /dev/null
+++ b/command/sol_cmds.cpp
@@ -0,0 +1,52 @@
+#include <phosphor-logging/log.hpp>
+#include "main.hpp"
+#include "sol/sol_context.hpp"
+#include "sol/sol_manager.hpp"
+#include "sol_cmds.hpp"
+
+namespace sol
+{
+
+namespace command
+{
+
+using namespace phosphor::logging;
+
+std::vector<uint8_t> payloadHandler(std::vector<uint8_t>& inPayload,
+ const message::Handler& handler)
+{
+ auto request = reinterpret_cast<Payload*>(inPayload.data());
+
+ auto solDataSize = inPayload.size() - sizeof(Payload);
+
+ Buffer charData(solDataSize);
+ if( solDataSize > 0)
+ {
+ std::copy_n(inPayload.data() + sizeof(Payload),
+ solDataSize,
+ charData.begin());
+ }
+
+ try
+ {
+ auto& context = std::get<sol::Manager&>(singletonPool).
+ getContext(handler.sessionID);
+
+ context.processInboundPayload(request->packetSeqNum,
+ request->packetAckSeqNum,
+ request->acceptedCharCount,
+ request->inOperation.ack,
+ charData);
+ }
+ catch (std::exception& e)
+ {
+ log<level::ERR>(e.what());
+ return std::vector<uint8_t>();
+ }
+
+ return std::vector<uint8_t>();
+}
+
+} // namespace command
+
+} // namespace sol
diff --git a/command/sol_cmds.hpp b/command/sol_cmds.hpp
new file mode 100644
index 0000000..3c3e23d
--- /dev/null
+++ b/command/sol_cmds.hpp
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <vector>
+#include "message_handler.hpp"
+
+namespace sol
+{
+
+namespace command
+{
+
+/** @brief SOL Payload Handler
+ *
+ * This command is used for activating and deactivating a payload type under a
+ * given IPMI session. The UDP Port number for SOL is the same as the port that
+ * was used to establish the IPMI session.
+ *
+ * @param[in] inPayload - Request data for the command.
+ * @param[in] handler - Reference to the message handler.
+ *
+ * @return Response data for the command.
+ */
+std::vector<uint8_t> payloadHandler(std::vector<uint8_t>& inPayload,
+ const message::Handler& handler);
+} // namespace command
+
+} // namespace sol
OpenPOWER on IntegriCloud