summaryrefslogtreecommitdiffstats
path: root/message_handler.cpp
diff options
context:
space:
mode:
authorTom Joseph <tomjoseph@in.ibm.com>2017-03-31 11:01:08 +0530
committerPatrick Williams <patrick@stwcx.xyz>2017-04-25 19:12:26 +0000
commit63d3e49c095e3d06ffcae39e92d5020e348e0a64 (patch)
tree479c57e8bac1472bf75ed23e08f2babbbe11d44b /message_handler.cpp
parent22596f21a91e138eb4774416c1ef36b9655e7376 (diff)
downloadphosphor-net-ipmid-63d3e49c095e3d06ffcae39e92d5020e348e0a64.tar.gz
phosphor-net-ipmid-63d3e49c095e3d06ffcae39e92d5020e348e0a64.zip
Add function to send unsolicited IPMI payload to remote console.
Change-Id: Ifd9c711c16a6640d36d6247a7c3b46a7db1c6596 Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
Diffstat (limited to 'message_handler.cpp')
-rw-r--r--message_handler.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/message_handler.cpp b/message_handler.cpp
index e8dbe7d..ef9eb06 100644
--- a/message_handler.cpp
+++ b/message_handler.cpp
@@ -207,5 +207,55 @@ void Handler::sendSOLPayload(const sol::Buffer& input)
send(outMessage);
}
+void Handler::sendUnsolicitedIPMIPayload(uint8_t netfn,
+ uint8_t cmd,
+ const std::vector<uint8_t>& output)
+{
+ Message outMessage;
+
+ auto session = (std::get<session::Manager&>(singletonPool).getSession(
+ sessionID)).lock();
+
+ outMessage.payloadType = PayloadType::IPMI;
+ outMessage.isPacketEncrypted = session->isCryptAlgoEnabled();
+ outMessage.isPacketAuthenticated = session->isIntegrityAlgoEnabled();
+ outMessage.rcSessionID = session->getRCSessionID();
+ outMessage.bmcSessionID = sessionID;
+
+ outMessage.payload.resize(sizeof(LAN::header::Request) +
+ output.size() +
+ sizeof(LAN::trailer::Request));
+
+ auto respHeader = reinterpret_cast<LAN::header::Request*>
+ (outMessage.payload.data());
+
+ // Add IPMI LAN Message Request Header
+ respHeader->rsaddr = LAN::requesterBMCAddress;
+ respHeader->netfn = (netfn << 0x02);
+ respHeader->cs = crc8bit(&(respHeader->rsaddr), 2);
+ respHeader->rqaddr = LAN::responderBMCAddress;
+ respHeader->rqseq = 0;
+ respHeader->cmd = cmd;
+
+ auto assembledSize = sizeof(LAN::header::Request);
+
+ // Copy the output by the execution of the command
+ std::copy(output.begin(),
+ output.end(),
+ outMessage.payload.begin() + assembledSize);
+ assembledSize += output.size();
+
+ // Add the IPMI LAN Message Trailer
+ auto trailer = reinterpret_cast<LAN::trailer::Request*>
+ (outMessage.payload.data() + assembledSize);
+
+ // Calculate the checksum for the field rqaddr in the header to the
+ // command data, 3 corresponds to size of the fields before rqaddr( rsaddr,
+ // netfn, cs).
+ trailer->checksum = crc8bit(&respHeader->rqaddr, assembledSize - 3);
+
+ send(outMessage);
+}
+
} //namespace message
OpenPOWER on IntegriCloud