diff options
author | Tom Joseph <tomjoseph@in.ibm.com> | 2017-03-31 11:01:08 +0530 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2017-04-25 19:12:26 +0000 |
commit | 63d3e49c095e3d06ffcae39e92d5020e348e0a64 (patch) | |
tree | 479c57e8bac1472bf75ed23e08f2babbbe11d44b /message_handler.cpp | |
parent | 22596f21a91e138eb4774416c1ef36b9655e7376 (diff) | |
download | phosphor-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.cpp | 50 |
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 |