1 #include "sol_cmds.hpp" 2 3 #include "sessions_manager.hpp" 4 #include "sol/sol_context.hpp" 5 #include "sol/sol_manager.hpp" 6 7 #include <phosphor-logging/log.hpp> 8 9 namespace sol 10 { 11 12 namespace command 13 { 14 15 using namespace phosphor::logging; 16 17 std::vector<uint8_t> payloadHandler(const std::vector<uint8_t>& inPayload, 18 std::shared_ptr<message::Handler>& handler) 19 { 20 // Check inPayload size is at least Payload 21 if (inPayload.size() < sizeof(Payload)) 22 { 23 return std::vector<uint8_t>(); 24 } 25 26 auto request = reinterpret_cast<const Payload*>(inPayload.data()); 27 auto solDataSize = inPayload.size() - sizeof(Payload); 28 29 std::vector<uint8_t> charData(solDataSize); 30 if (solDataSize > 0) 31 { 32 std::copy_n(inPayload.data() + sizeof(Payload), solDataSize, 33 charData.begin()); 34 } 35 36 try 37 { 38 auto& context = sol::Manager::get().getContext(handler->sessionID); 39 40 context.processInboundPayload( 41 request->packetSeqNum, request->packetAckSeqNum, 42 request->acceptedCharCount, request->inOperation.ack, charData); 43 } 44 catch (const std::exception& e) 45 { 46 log<level::ERR>(e.what()); 47 return std::vector<uint8_t>(); 48 } 49 50 return std::vector<uint8_t>(); 51 } 52 53 void activating(uint8_t payloadInstance, uint32_t sessionID) 54 { 55 std::vector<uint8_t> outPayload(sizeof(ActivatingRequest)); 56 57 auto request = reinterpret_cast<ActivatingRequest*>(outPayload.data()); 58 59 request->sessionState = 0; 60 request->payloadInstance = payloadInstance; 61 request->majorVersion = MAJOR_VERSION; 62 request->minorVersion = MINOR_VERSION; 63 64 auto session = session::Manager::get().getSession(sessionID); 65 66 message::Handler msgHandler(session->channelPtr, sessionID); 67 68 msgHandler.sendUnsolicitedIPMIPayload(netfnTransport, solActivatingCmd, 69 outPayload); 70 } 71 72 std::vector<uint8_t> getConfParams(const std::vector<uint8_t>& inPayload, 73 std::shared_ptr<message::Handler>& handler) 74 { 75 std::vector<uint8_t> outPayload(sizeof(GetConfParamsResponse)); 76 auto request = 77 reinterpret_cast<const GetConfParamsRequest*>(inPayload.data()); 78 auto response = reinterpret_cast<GetConfParamsResponse*>(outPayload.data()); 79 response->completionCode = IPMI_CC_OK; 80 response->paramRev = parameterRevision; 81 82 // Update latest property values from dbus to sol mananger 83 sol::Manager::get().updateSOLParameter(ipmi::convertCurrentChannelNum( 84 ipmi::currentChNum, getInterfaceIndex())); 85 if (request->getParamRev) 86 { 87 return outPayload; 88 } 89 90 switch (static_cast<Parameter>(request->paramSelector)) 91 { 92 case Parameter::PROGRESS: 93 { 94 outPayload.push_back(sol::Manager::get().progress); 95 break; 96 } 97 case Parameter::ENABLE: 98 { 99 outPayload.push_back(sol::Manager::get().enable); 100 break; 101 } 102 case Parameter::AUTHENTICATION: 103 { 104 Auth value{0}; 105 106 value.encrypt = sol::Manager::get().forceEncrypt; 107 value.auth = sol::Manager::get().forceAuth; 108 value.privilege = 109 static_cast<uint8_t>(sol::Manager::get().solMinPrivilege); 110 auto buffer = reinterpret_cast<const uint8_t*>(&value); 111 112 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload)); 113 break; 114 } 115 case Parameter::ACCUMULATE: 116 { 117 Accumulate value{0}; 118 119 value.interval = sol::Manager::get().accumulateInterval.count() / 120 sol::accIntervalFactor; 121 value.threshold = sol::Manager::get().sendThreshold; 122 auto buffer = reinterpret_cast<const uint8_t*>(&value); 123 124 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload)); 125 break; 126 } 127 case Parameter::RETRY: 128 { 129 Retry value{0}; 130 131 value.count = sol::Manager::get().retryCount; 132 value.interval = sol::Manager::get().retryInterval.count() / 133 sol::retryIntervalFactor; 134 auto buffer = reinterpret_cast<const uint8_t*>(&value); 135 136 std::copy_n(buffer, sizeof(value), std::back_inserter(outPayload)); 137 break; 138 } 139 case Parameter::PORT: 140 { 141 auto port = endian::to_ipmi<uint16_t>(IPMI_STD_PORT); 142 auto buffer = reinterpret_cast<const uint8_t*>(&port); 143 144 std::copy_n(buffer, sizeof(port), std::back_inserter(outPayload)); 145 break; 146 } 147 case Parameter::CHANNEL: 148 { 149 outPayload.push_back(sol::Manager::get().channel); 150 break; 151 } 152 case Parameter::NVBITRATE: 153 case Parameter::VBITRATE: 154 default: 155 response->completionCode = ipmiCCParamNotSupported; 156 } 157 158 return outPayload; 159 } 160 161 } // namespace command 162 163 } // namespace sol 164