1*4aa93176SNikhil Namjoshi // Copyright 2022 Google LLC 2*4aa93176SNikhil Namjoshi // 3*4aa93176SNikhil Namjoshi // Licensed under the Apache License, Version 2.0 (the "License"); 4*4aa93176SNikhil Namjoshi // you may not use this file except in compliance with the License. 5*4aa93176SNikhil Namjoshi // You may obtain a copy of the License at 6*4aa93176SNikhil Namjoshi // 7*4aa93176SNikhil Namjoshi // http://www.apache.org/licenses/LICENSE-2.0 8*4aa93176SNikhil Namjoshi // 9*4aa93176SNikhil Namjoshi // Unless required by applicable law or agreed to in writing, software 10*4aa93176SNikhil Namjoshi // distributed under the License is distributed on an "AS IS" BASIS, 11*4aa93176SNikhil Namjoshi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*4aa93176SNikhil Namjoshi // See the License for the specific language governing permissions and 13*4aa93176SNikhil Namjoshi // limitations under the License. 148cfa4c44Slinyuny 158cfa4c44Slinyuny #include "host_power_off.hpp" 168cfa4c44Slinyuny 178cfa4c44Slinyuny #include "commands.hpp" 188cfa4c44Slinyuny #include "errors.hpp" 198cfa4c44Slinyuny #include "handler.hpp" 208cfa4c44Slinyuny 218cfa4c44Slinyuny #include <cstdint> 228cfa4c44Slinyuny #include <cstring> 23ff3cd8e9SWilly Tu #include <ipmid/api-types.hpp> 24b4e3704cSWilly Tu #include <span> 25ff3cd8e9SWilly Tu #include <vector> 268cfa4c44Slinyuny 278cfa4c44Slinyuny namespace google 288cfa4c44Slinyuny { 298cfa4c44Slinyuny namespace ipmi 308cfa4c44Slinyuny { 318cfa4c44Slinyuny 32b4e3704cSWilly Tu Resp hostPowerOff(std::span<const uint8_t> data, 33ff3cd8e9SWilly Tu const HandlerInterface* handler) 348cfa4c44Slinyuny { 358cfa4c44Slinyuny struct HostPowerOffRequest request; 368cfa4c44Slinyuny 37ff3cd8e9SWilly Tu if (data.size() < sizeof(request)) 388cfa4c44Slinyuny { 398cfa4c44Slinyuny std::fprintf(stderr, "Invalid command length: %u\n", 40ff3cd8e9SWilly Tu static_cast<uint32_t>(data.size())); 41ff3cd8e9SWilly Tu return ::ipmi::responseReqDataLenInvalid(); 428cfa4c44Slinyuny } 438cfa4c44Slinyuny 44ff3cd8e9SWilly Tu std::memcpy(&request, data.data(), sizeof(struct HostPowerOffRequest)); 458cfa4c44Slinyuny try 468cfa4c44Slinyuny { 478cfa4c44Slinyuny handler->hostPowerOffDelay(request.delay); 488cfa4c44Slinyuny } 498cfa4c44Slinyuny catch (const IpmiException& e) 508cfa4c44Slinyuny { 51ff3cd8e9SWilly Tu return ::ipmi::response(e.getIpmiError()); 528cfa4c44Slinyuny } 538cfa4c44Slinyuny 54ff3cd8e9SWilly Tu return ::ipmi::responseSuccess(SysOEMCommands::SysHostPowerOff, 55ff3cd8e9SWilly Tu std::vector<uint8_t>{}); 568cfa4c44Slinyuny } 578cfa4c44Slinyuny } // namespace ipmi 588cfa4c44Slinyuny } // namespace google 59