blob: d7554b8a18a85d3756cf97ec61bfbacbf50015ef [file] [log] [blame]
/*
* Copyright 2023 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "pldm-oem-google.h"
#include <phosphor-logging/log.hpp>
#include <cstddef>
uint16_t platform_oem_google_decode_event_message_req(
const uint8_t* event_data, size_t event_data_length,
size_t* oem_event_data_offset, size_t* oem_event_data_len)
{
if (!event_data)
{
phosphor::logging::log<phosphor::logging::level::ERR>(
"Invalid OEM event_data");
return PLDM_EVENT_OEM_GOOGLE_ID_UNDEFINED;
}
if (event_data_length < sizeof(pldm_event_oem_google_event_hdr))
{
phosphor::logging::log<phosphor::logging::level::ERR>(
"Invalid OEM event_data_length");
return PLDM_EVENT_OEM_GOOGLE_ID_UNDEFINED;
}
const auto* eventHdr =
reinterpret_cast<const struct pldm_event_oem_google_event_hdr*>(
event_data);
if (!isGoogleIANA(eventHdr->IANA))
{
phosphor::logging::log<phosphor::logging::level::ERR>(
"Invalid OEM GoogleIANA");
return PLDM_EVENT_OEM_GOOGLE_ID_UNDEFINED;
}
if (oem_event_data_offset)
{
*oem_event_data_offset = sizeof(struct pldm_event_oem_google_event_hdr);
}
if (oem_event_data_len)
{
*oem_event_data_len = event_data_length -
sizeof(struct pldm_event_oem_google_event_hdr);
}
return eventHdr->googleOEMEventID;
}
const struct pldm_event_oem_google_soc_reset_me*
pldm_event_oem_google_soc_reset_me_msg(const uint8_t* oem_event_data,
size_t oem_event_data_len)
{
if (oem_event_data == nullptr ||
oem_event_data_len < sizeof(struct pldm_event_oem_google_soc_reset_me))
{
return nullptr;
}
const auto* socResetMeMsg =
reinterpret_cast<const struct pldm_event_oem_google_soc_reset_me*>(
oem_event_data);
if (oem_event_data_len <
(socResetMeMsg->descLen +
sizeof(struct pldm_event_oem_google_soc_reset_me)))
{
return nullptr;
}
return socResetMeMsg;
}