// SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: Copyright 2017 Google Inc #include "manualcmds.hpp" #include "control.hpp" #include "manual_messages.hpp" #include #include #include #include #include namespace pid_control::ipmi { static constexpr auto manualProperty = "Manual"; static constexpr auto failsafeProperty = "FailSafe"; ::ipmi::Cc ZoneControlIpmiHandler::getFailsafeModeState( const uint8_t* reqBuf, uint8_t* replyBuf, size_t* dataLen) { bool current; if (*dataLen < sizeof(struct FanCtrlRequest)) { return ::ipmi::ccInvalidCommand; } const auto request = reinterpret_cast(&reqBuf[0]); ::ipmi::Cc rc = _control->getFanCtrlProperty(request->zone, ¤t, failsafeProperty); if (rc) { return rc; } *replyBuf = (uint8_t)current; *dataLen = sizeof(uint8_t); return ::ipmi::ccSuccess; } /* * * * * */ ::ipmi::Cc ZoneControlIpmiHandler::getManualModeState( const uint8_t* reqBuf, uint8_t* replyBuf, size_t* dataLen) { bool current; if (*dataLen < sizeof(struct FanCtrlRequest)) { return ::ipmi::ccInvalidCommand; } const auto request = reinterpret_cast(&reqBuf[0]); ::ipmi::Cc rc = _control->getFanCtrlProperty(request->zone, ¤t, manualProperty); if (rc) { return rc; } *replyBuf = (uint8_t)current; *dataLen = sizeof(uint8_t); return ::ipmi::ccSuccess; } /* * * * * * */ ::ipmi::Cc ZoneControlIpmiHandler::setManualModeState( const uint8_t* reqBuf, [[maybe_unused]] uint8_t* replyBuf, const size_t* dataLen) { if (*dataLen < sizeof(struct FanCtrlRequestSet)) { return ::ipmi::ccInvalidCommand; } const auto request = reinterpret_cast(&reqBuf[0]); /* 0 is false, 1 is true */ ::ipmi::Cc rc = _control->setFanCtrlProperty( request->zone, static_cast(request->value), manualProperty); return rc; } /* Three command packages: get, set true, set false */ ::ipmi::Cc manualModeControl( ZoneControlIpmiHandler* handler, [[maybe_unused]] uint8_t cmd, const uint8_t* reqBuf, uint8_t* replyCmdBuf, size_t* dataLen) { // FanCtrlRequest is the smaller of the requests, so it's at a minimum. if (*dataLen < sizeof(struct FanCtrlRequest)) { return ::ipmi::ccInvalidCommand; } const auto request = reinterpret_cast(&reqBuf[0]); ::ipmi::Cc rc = ::ipmi::ccSuccess; switch (request->command) { case getControlState: return handler->getManualModeState(reqBuf, replyCmdBuf, dataLen); case setControlState: return handler->setManualModeState(reqBuf, replyCmdBuf, dataLen); case getFailsafeState: return handler->getFailsafeModeState(reqBuf, replyCmdBuf, dataLen); default: rc = ::ipmi::ccInvalidCommand; } return rc; } } // namespace pid_control::ipmi