19e801a2bSVernon Mauery #include "sol_cmds.hpp"
29e801a2bSVernon Mauery 
32085ae07SVernon Mauery #include "sessions_manager.hpp"
464b3dec8STom Joseph #include "sol/sol_context.hpp"
564b3dec8STom Joseph #include "sol/sol_manager.hpp"
69e801a2bSVernon Mauery 
77b7f25f7SGeorge Liu #include <phosphor-logging/lg2.hpp>
864b3dec8STom Joseph 
964b3dec8STom Joseph namespace sol
1064b3dec8STom Joseph {
1164b3dec8STom Joseph 
1264b3dec8STom Joseph namespace command
1364b3dec8STom Joseph {
1464b3dec8STom Joseph 
1564b3dec8STom Joseph using namespace phosphor::logging;
1664b3dec8STom Joseph 
payloadHandler(const std::vector<uint8_t> & inPayload,std::shared_ptr<message::Handler> & handler)1718a45e9dSTom Joseph std::vector<uint8_t> payloadHandler(const std::vector<uint8_t>& inPayload,
1841ff9b51SVernon Mauery                                     std::shared_ptr<message::Handler>& handler)
1964b3dec8STom Joseph {
202b1edef0SZhikui Ren     // Check inPayload size is at least Payload
212b1edef0SZhikui Ren     if (inPayload.size() < sizeof(Payload))
222b1edef0SZhikui Ren     {
232b1edef0SZhikui Ren         return std::vector<uint8_t>();
242b1edef0SZhikui Ren     }
252b1edef0SZhikui Ren 
2618a45e9dSTom Joseph     auto request = reinterpret_cast<const Payload*>(inPayload.data());
2764b3dec8STom Joseph     auto solDataSize = inPayload.size() - sizeof(Payload);
2864b3dec8STom Joseph 
2970fd29cfSVernon Mauery     std::vector<uint8_t> charData(solDataSize);
3064b3dec8STom Joseph     if (solDataSize > 0)
3164b3dec8STom Joseph     {
329e801a2bSVernon Mauery         std::copy_n(inPayload.data() + sizeof(Payload), solDataSize,
3364b3dec8STom Joseph                     charData.begin());
3464b3dec8STom Joseph     }
3564b3dec8STom Joseph 
3664b3dec8STom Joseph     try
3764b3dec8STom Joseph     {
3841ff9b51SVernon Mauery         auto& context = sol::Manager::get().getContext(handler->sessionID);
3964b3dec8STom Joseph 
409e801a2bSVernon Mauery         context.processInboundPayload(
419e801a2bSVernon Mauery             request->packetSeqNum, request->packetAckSeqNum,
42*ec437414STingting Chen             request->acceptedCharCount, request->inOperation.ack,
43*ec437414STingting Chen             request->inOperation.generateBreak, charData);
4464b3dec8STom Joseph     }
4512d199b2SPatrick Williams     catch (const std::exception& e)
4664b3dec8STom Joseph     {
477b7f25f7SGeorge Liu         lg2::error("Failed to call the getContext method: {ERROR}", "ERROR", e);
4864b3dec8STom Joseph         return std::vector<uint8_t>();
4964b3dec8STom Joseph     }
5064b3dec8STom Joseph 
5164b3dec8STom Joseph     return std::vector<uint8_t>();
5264b3dec8STom Joseph }
5364b3dec8STom Joseph 
activating(uint8_t payloadInstance,uint32_t sessionID)54e14ac96fSTom Joseph void activating(uint8_t payloadInstance, uint32_t sessionID)
55e14ac96fSTom Joseph {
56e14ac96fSTom Joseph     std::vector<uint8_t> outPayload(sizeof(ActivatingRequest));
57e14ac96fSTom Joseph 
589e801a2bSVernon Mauery     auto request = reinterpret_cast<ActivatingRequest*>(outPayload.data());
59e14ac96fSTom Joseph 
60e14ac96fSTom Joseph     request->sessionState = 0;
61e14ac96fSTom Joseph     request->payloadInstance = payloadInstance;
62e14ac96fSTom Joseph     request->majorVersion = MAJOR_VERSION;
63e14ac96fSTom Joseph     request->minorVersion = MINOR_VERSION;
64e14ac96fSTom Joseph 
652085ae07SVernon Mauery     auto session = session::Manager::get().getSession(sessionID);
66e14ac96fSTom Joseph 
67e14ac96fSTom Joseph     message::Handler msgHandler(session->channelPtr, sessionID);
68e14ac96fSTom Joseph 
699e801a2bSVernon Mauery     msgHandler.sendUnsolicitedIPMIPayload(netfnTransport, solActivatingCmd,
70e14ac96fSTom Joseph                                           outPayload);
71e14ac96fSTom Joseph }
7264b3dec8STom Joseph } // namespace command
7364b3dec8STom Joseph 
7464b3dec8STom Joseph } // namespace sol
75